mirror of
				https://github.com/XRPLF/rippled.git
				synced 2025-11-04 11:15:56 +00:00 
			
		
		
		
	Compare commits
	
		
			341 Commits
		
	
	
		
			2.1.0-rc1
			...
			a1q123456/
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					4b5ed9c219 | ||
| 
						 | 
					5dd2020902 | ||
| 
						 | 
					ae95aff7aa | ||
| 
						 | 
					4f5fb6b298 | ||
| 
						 | 
					c742a94e5f | ||
| 
						 | 
					abf240f6f3 | ||
| 
						 | 
					3f8fed9628 | ||
| 
						 | 
					e2e82e1c96 | ||
| 
						 | 
					a7a39d62d3 | ||
| 
						 | 
					b875ea9f37 | ||
| 
						 | 
					a25f2ee9dd | ||
| 
						 | 
					4f295d4856 | ||
| 
						 | 
					2e5f69f8f8 | ||
| 
						 | 
					02da6b2508 | ||
| 
						 | 
					b113190563 | ||
| 
						 | 
					358b7f50a7 | ||
| 
						 | 
					f47e2f4e82 | ||
| 
						 | 
					a7eea9546f | ||
| 
						 | 
					9874d47d7f | ||
| 
						 | 
					c2f3e2e263 | ||
| 
						 | 
					e18f27f5f7 | ||
| 
						 | 
					df6daf0d8f | ||
| 
						 | 
					e9d46f0bfc | ||
| 
						 | 
					42fd74b77b | ||
| 
						 | 
					c55ea56c5e | ||
| 
						 | 
					1e01cd34f7 | ||
| 
						 | 
					e2fa5c1b7c | ||
| 
						 | 
					fc0984d286 | ||
| 
						 | 
					8b3dcd41f7 | ||
| 
						 | 
					8f2f5310e2 | ||
| 
						 | 
					edb4f0342c | ||
| 
						 | 
					ea17abb92a | ||
| 
						 | 
					35a40a8e62 | ||
| 
						 | 
					d494bf45b2 | ||
| 
						 | 
					8bf4a5cbff | ||
| 
						 | 
					58c2c82a30 | ||
| 
						 | 
					11edaa441d | ||
| 
						 | 
					a5e953b191 | ||
| 
						 | 
					506ae12a8c | ||
| 
						 | 
					0310c5cbe0 | ||
| 
						 | 
					053e1af7ff | ||
| 
						 | 
					7e24adbdd0 | ||
| 
						 | 
					621df422a7 | ||
| 
						 | 
					0a34b5c691 | ||
| 
						 | 
					e0bc3dd51f | ||
| 
						 | 
					dacecd24ba | ||
| 
						 | 
					05105743e9 | ||
| 
						 | 
					9e1fe9a85e | ||
| 
						 | 
					d71ce51901 | ||
| 
						 | 
					be668ee26d | ||
| 
						 | 
					cae5294b4e | ||
| 
						 | 
					cd777f79ef | ||
| 
						 | 
					8b9e21e3f5 | ||
| 
						 | 
					2a61aee562 | ||
| 
						 | 
					40ce8a8833 | ||
| 
						 | 
					7713ff8c5c | ||
| 
						 | 
					70371a4344 | ||
| 
						 | 
					e514de76ed | ||
| 
						 | 
					dd62cfcc22 | ||
| 
						 | 
					09690f1b38 | ||
| 
						 | 
					380ba9f1c1 | ||
| 
						 | 
					c3e9380fb4 | ||
| 
						 | 
					e3ebc253fa | ||
| 
						 | 
					c6c7c84355 | ||
| 
						 | 
					28f50cb7cf | ||
| 
						 | 
					3e152fec74 | ||
| 
						 | 
					2db2791805 | ||
| 
						 | 
					9ec2d7f8ff | ||
| 
						 | 
					4a084ce34c | ||
| 
						 | 
					3502df2174 | ||
| 
						 | 
					fa1e25abef | ||
| 
						 | 
					217ba8dd4d | ||
| 
						 | 
					405f4613d8 | ||
| 
						 | 
					cba512068b | ||
| 
						 | 
					1c99ea23d1 | ||
| 
						 | 
					c4308b216f | ||
| 
						 | 
					aafd2d8525 | ||
| 
						 | 
					a574ec6023 | ||
| 
						 | 
					e429455f4d | ||
| 
						 | 
					7692eeb9a0 | ||
| 
						 | 
					a099f5a804 | ||
| 
						 | 
					ca0bc767fe | ||
| 
						 | 
					4ba9288935 | ||
| 
						 | 
					e923ec6d36 | ||
| 
						 | 
					851d99d99e | ||
| 
						 | 
					f608e653ca | ||
| 
						 | 
					72e076b694 | ||
| 
						 | 
					6cf37c4abe | ||
| 
						 | 
					fc204773d6 | ||
| 
						 | 
					2bc5cb240f | ||
| 
						 | 
					67028d6ea6 | ||
| 
						 | 
					d22a5057b9 | ||
| 
						 | 
					75a20194c5 | ||
| 
						 | 
					7fe81fe62e | ||
| 
						 | 
					345ddc7234 | ||
| 
						 | 
					d167d4864f | ||
| 
						 | 
					bf504912a4 | ||
| 
						 | 
					a7fb8ae915 | ||
| 
						 | 
					d9b7a2688f | ||
| 
						 | 
					c0299dba88 | ||
| 
						 | 
					c3ecdb4746 | ||
| 
						 | 
					c17676a9be | ||
| 
						 | 
					ed8e32cc92 | ||
| 
						 | 
					2406b28e64 | ||
| 
						 | 
					2216e5a13f | ||
| 
						 | 
					5bf3a308d5 | ||
| 
						 | 
					53ea31c69a | ||
| 
						 | 
					c1c2b5bf52 | ||
| 
						 | 
					af018c7b0b | ||
| 
						 | 
					0a1ca0600f | ||
| 
						 | 
					cd7c62818b | ||
| 
						 | 
					37d06bcce8 | ||
| 
						 | 
					9745718467 | ||
| 
						 | 
					ab44cc31e2 | ||
| 
						 | 
					dce3e1efa6 | ||
| 
						 | 
					159dfb5acb | ||
| 
						 | 
					844646dc50 | ||
| 
						 | 
					01fc8f2209 | ||
| 
						 | 
					43e1d4440e | ||
| 
						 | 
					466849efe8 | ||
| 
						 | 
					db0fad6826 | ||
| 
						 | 
					dd5e6559dd | ||
| 
						 | 
					7c9d652d9b | ||
| 
						 | 
					dc9e6c37fe | ||
| 
						 | 
					01fe9477f4 | ||
| 
						 | 
					97e3dae6f4 | ||
| 
						 | 
					e8e7888a23 | ||
| 
						 | 
					b02b8d016c | ||
| 
						 | 
					a079bac153 | ||
| 
						 | 
					3a55a64e1c | ||
| 
						 | 
					fa5a85439f | ||
| 
						 | 
					81034596a8 | ||
| 
						 | 
					0968cdf340 | ||
| 
						 | 
					d9e4009e33 | ||
| 
						 | 
					02387fd227 | ||
| 
						 | 
					fb3713bc25 | ||
| 
						 | 
					f6d63082c0 | ||
| 
						 | 
					33e1c42599 | ||
| 
						 | 
					1b75dc8bcd | ||
| 
						 | 
					3d02580c09 | ||
| 
						 | 
					8458233a31 | ||
| 
						 | 
					cb0ddbf863 | ||
| 
						 | 
					dcc4581220 | ||
| 
						 | 
					50b8f19cb5 | ||
| 
						 | 
					f3e201f983 | ||
| 
						 | 
					b14c24960b | ||
| 
						 | 
					b6e3453f49 | ||
| 
						 | 
					ed4870cdb4 | ||
| 
						 | 
					5fbee8c824 | ||
| 
						 | 
					3868c04e99 | ||
| 
						 | 
					409c1d5aa2 | ||
| 
						 | 
					20710f5232 | ||
| 
						 | 
					870882f567 | ||
| 
						 | 
					e1e67b2c9e | ||
| 
						 | 
					eac3abdca9 | ||
| 
						 | 
					ebd8e63276 | ||
| 
						 | 
					839d17e7bd | ||
| 
						 | 
					7be5c31bc6 | ||
| 
						 | 
					9e4a7d5871 | ||
| 
						 | 
					ff8b9aa439 | ||
| 
						 | 
					ccc0889803 | ||
| 
						 | 
					07f118caec | ||
| 
						 | 
					58af62f388 | ||
| 
						 | 
					040cd23e4a | ||
| 
						 | 
					0324764a83 | ||
| 
						 | 
					679e35fd46 | ||
| 
						 | 
					49e0d54c76 | ||
| 
						 | 
					7506852a99 | ||
| 
						 | 
					bcbfb04992 | ||
| 
						 | 
					5cd72f2431 | ||
| 
						 | 
					eabca8439f | ||
| 
						 | 
					ea1fffeebf | ||
| 
						 | 
					6d58065909 | ||
| 
						 | 
					47b0543461 | ||
| 
						 | 
					8215c605b4 | ||
| 
						 | 
					d7e949193f | ||
| 
						 | 
					f64cf9187a | ||
| 
						 | 
					b54d85d862 | ||
| 
						 | 
					f419c18056 | ||
| 
						 | 
					0ec17b6026 | ||
| 
						 | 
					838978b869 | ||
| 
						 | 
					8186253707 | ||
| 
						 | 
					2316d843d7 | ||
| 
						 | 
					9d58f11a60 | ||
| 
						 | 
					7b18006193 | ||
| 
						 | 
					9e48fc0c83 | ||
| 
						 | 
					8e827e32ac | ||
| 
						 | 
					c5c0e70e23 | ||
| 
						 | 
					ec61f5e9d3 | ||
| 
						 | 
					d57cced17b | ||
| 
						 | 
					54a350be79 | ||
| 
						 | 
					d6dbf0e0a6 | ||
| 
						 | 
					0d887ad815 | ||
| 
						 | 
					d4a5f8390e | ||
| 
						 | 
					ab5d450d3c | ||
| 
						 | 
					23c37fa506 | ||
| 
						 | 
					63209c2646 | ||
| 
						 | 
					f0dabd1446 | ||
| 
						 | 
					552377c76f | ||
| 
						 | 
					e7cd03325b | ||
| 
						 | 
					decb3c178e | ||
| 
						 | 
					f6d647d6c3 | ||
| 
						 | 
					bf4a7b6ce8 | ||
| 
						 | 
					8e2c85d14d | ||
| 
						 | 
					1fbf8da79f | ||
| 
						 | 
					a75309919e | ||
| 
						 | 
					0ece395c24 | ||
| 
						 | 
					b6391fe011 | ||
| 
						 | 
					9a6af9c431 | ||
| 
						 | 
					fa1cbb0746 | ||
| 
						 | 
					68e1be3cf5 | ||
| 
						 | 
					9abc4868d6 | ||
| 
						 | 
					23991c99c3 | ||
| 
						 | 
					cc0177be87 | ||
| 
						 | 
					37b3e96b04 | ||
| 
						 | 
					85214bdf81 | ||
| 
						 | 
					fbbea9e6e2 | ||
| 
						 | 
					7741483894 | ||
| 
						 | 
					2f432e812c | ||
| 
						 | 
					cad8970a57 | ||
| 
						 | 
					4d7aed84ec | ||
| 
						 | 
					00ed7c9424 | ||
| 
						 | 
					d9bd75e683 | ||
| 
						 | 
					93d8bafb24 | ||
| 
						 | 
					c19a88fee9 | ||
| 
						 | 
					0a331ea72e | ||
| 
						 | 
					7d27b11190 | ||
| 
						 | 
					eedfec015e | ||
| 
						 | 
					ffc343a2bc | ||
| 
						 | 
					e5aa605742 | ||
| 
						 | 
					8b181ed818 | ||
| 
						 | 
					f5a349558e | ||
| 
						 | 
					b9b75ddcf5 | ||
| 
						 | 
					a39720e94a | ||
| 
						 | 
					2820feb02a | ||
| 
						 | 
					8fc805d2e2 | ||
| 
						 | 
					d54151e7c4 | ||
| 
						 | 
					21a0a64648 | ||
| 
						 | 
					20707fac4a | ||
| 
						 | 
					e6ef0fc26c | ||
| 
						 | 
					c157816017 | ||
| 
						 | 
					eba5d19377 | ||
| 
						 | 
					ad14d09a2b | ||
| 
						 | 
					f3bcc651c7 | ||
| 
						 | 
					e8602b81fa | ||
| 
						 | 
					0f32109993 | ||
| 
						 | 
					a17ccca615 | ||
| 
						 | 
					7a1b238035 | ||
| 
						 | 
					e1534a3200 | ||
| 
						 | 
					9fec615dca | ||
| 
						 | 
					ef02893f2f | ||
| 
						 | 
					7cf4611d7c | ||
| 
						 | 
					d028005aa6 | ||
| 
						 | 
					1d23148e6d | ||
| 
						 | 
					e416ee72ca | ||
| 
						 | 
					2e902dee53 | ||
| 
						 | 
					f6879da6c9 | ||
| 
						 | 
					ae20a3ad3f | ||
| 
						 | 
					c706926ee3 | ||
| 
						 | 
					223e6c7590 | ||
| 
						 | 
					825864032a | ||
| 
						 | 
					06733ec21a | ||
| 
						 | 
					9f7c619e4f | ||
| 
						 | 
					3f5e3212fe | ||
| 
						 | 
					20d05492d2 | ||
| 
						 | 
					ae7ea33b75 | ||
| 
						 | 
					263e984bf4 | ||
| 
						 | 
					58f3abe3c6 | ||
| 
						 | 
					d576416953 | ||
| 
						 | 
					e3d1bb271f | ||
| 
						 | 
					2df635693d | ||
| 
						 | 
					40b4adc9cc | ||
| 
						 | 
					0c971b4415 | ||
| 
						 | 
					f2d37da4ca | ||
| 
						 | 
					d5e5c3c220 | ||
| 
						 | 
					15390bedd5 | ||
| 
						 | 
					7f6a079aa4 | ||
| 
						 | 
					2a25f58d40 | ||
| 
						 | 
					2705109592 | ||
| 
						 | 
					244ac5e024 | ||
| 
						 | 
					f4da2e31d9 | ||
| 
						 | 
					f650949573 | ||
| 
						 | 
					76128051c0 | ||
| 
						 | 
					5aa1106ba1 | ||
| 
						 | 
					dccf3f49ef | ||
| 
						 | 
					02ec8b7962 | ||
| 
						 | 
					3f7ce939c8 | ||
| 
						 | 
					b65cea1984 | ||
| 
						 | 
					b422e71eed | ||
| 
						 | 
					e9859ac1b1 | ||
| 
						 | 
					b84f7e7c10 | ||
| 
						 | 
					513842b23f | ||
| 
						 | 
					985c80fbc6 | ||
| 
						 | 
					35fe957020 | ||
| 
						 | 
					0eebe6a5f4 | ||
| 
						 | 
					760f16f568 | ||
| 
						 | 
					241b9ddde9 | ||
| 
						 | 
					3fcfb5cd49 | ||
| 
						 | 
					e2384885f5 | ||
| 
						 | 
					dd312c3cc5 | ||
| 
						 | 
					80379927e8 | ||
| 
						 | 
					676aae2755 | ||
| 
						 | 
					f20e66e6f9 | ||
| 
						 | 
					cd737ad7d3 | ||
| 
						 | 
					df3aa84523 | ||
| 
						 | 
					24a275ba25 | ||
| 
						 | 
					aae438315f | ||
| 
						 | 
					8b0d049b9f | ||
| 
						 | 
					659bd99a67 | ||
| 
						 | 
					c88166e055 | ||
| 
						 | 
					099c0bcd34 | ||
| 
						 | 
					d992e63075 | ||
| 
						 | 
					c187f750fe | ||
| 
						 | 
					bcbf6c1973 | ||
| 
						 | 
					4bcbf70cae | ||
| 
						 | 
					2d1854f354 | ||
| 
						 | 
					a7c4a47723 | ||
| 
						 | 
					61672ad3ff | ||
| 
						 | 
					cea43099d2 | ||
| 
						 | 
					6edf03c152 | ||
| 
						 | 
					47c8cc24f4 | ||
| 
						 | 
					64e46878e0 | ||
| 
						 | 
					ea9b1e3503 | ||
| 
						 | 
					2e9261cb26 | ||
| 
						 | 
					69143d71f8 | ||
| 
						 | 
					0c32fc5f2a | ||
| 
						 | 
					af9cabe100 | ||
| 
						 | 
					2ecb851926 | ||
| 
						 | 
					2ffead76c1 | ||
| 
						 | 
					5cc377751a | ||
| 
						 | 
					ad8e9764e6 | ||
| 
						 | 
					4ce426d8f6 | ||
| 
						 | 
					c28e005087 | ||
| 
						 | 
					22b751834f | ||
| 
						 | 
					cce09b717e | ||
| 
						 | 
					62dae3c6c6 | ||
| 
						 | 
					97863e0b62 | ||
| 
						 | 
					8a2f6bec33 | ||
| 
						 | 
					e718378bdb | ||
| 
						 | 
					d7d15a922a | ||
| 
						 | 
					e74cb35aa4 | 
@@ -44,18 +44,26 @@ DerivePointerAlignment: false
 | 
			
		||||
DisableFormat:   false
 | 
			
		||||
ExperimentalAutoDetectBinPacking: false
 | 
			
		||||
ForEachMacros:   [ Q_FOREACH,  BOOST_FOREACH ]
 | 
			
		||||
IncludeBlocks:   Regroup
 | 
			
		||||
IncludeCategories:
 | 
			
		||||
  - Regex:           '^<(BeastConfig)'
 | 
			
		||||
  - Regex:           '^<(test)/'
 | 
			
		||||
    Priority:        0
 | 
			
		||||
  - Regex:           '^<(ripple)/'
 | 
			
		||||
  - Regex:           '^<(xrpld)/'
 | 
			
		||||
    Priority:        1
 | 
			
		||||
  - Regex:           '^<(xrpl)/'
 | 
			
		||||
    Priority:        2
 | 
			
		||||
  - Regex:           '^<(boost)/'
 | 
			
		||||
    Priority:        3
 | 
			
		||||
  - Regex:           '.*'
 | 
			
		||||
  - Regex:           '^.*/'
 | 
			
		||||
    Priority:        4
 | 
			
		||||
  - Regex:           '^.*\.h'
 | 
			
		||||
    Priority:        5
 | 
			
		||||
  - Regex:           '.*'
 | 
			
		||||
    Priority:        6
 | 
			
		||||
IncludeIsMainRegex: '$'
 | 
			
		||||
IndentCaseLabels: true
 | 
			
		||||
IndentFunctionDeclarationAfterType: false
 | 
			
		||||
IndentRequiresClause: true
 | 
			
		||||
IndentWidth:     4
 | 
			
		||||
IndentWrappedFunctionNames: false
 | 
			
		||||
KeepEmptyLinesAtTheStartOfBlocks: false
 | 
			
		||||
@@ -71,6 +79,7 @@ PenaltyExcessCharacter: 1000000
 | 
			
		||||
PenaltyReturnTypeOnItsOwnLine: 200
 | 
			
		||||
PointerAlignment: Left
 | 
			
		||||
ReflowComments:  true
 | 
			
		||||
RequiresClausePosition: OwnLine
 | 
			
		||||
SortIncludes:    true
 | 
			
		||||
SpaceAfterCStyleCast: false
 | 
			
		||||
SpaceBeforeAssignmentOperators: true
 | 
			
		||||
@@ -85,3 +94,4 @@ SpacesInSquareBrackets: false
 | 
			
		||||
Standard:        Cpp11
 | 
			
		||||
TabWidth:        8
 | 
			
		||||
UseTab:          Never
 | 
			
		||||
QualifierAlignment: Right
 | 
			
		||||
							
								
								
									
										33
									
								
								.codecov.yml
									
									
									
									
									
								
							
							
						
						
									
										33
									
								
								.codecov.yml
									
									
									
									
									
								
							@@ -1,6 +1,37 @@
 | 
			
		||||
codecov:
 | 
			
		||||
  require_ci_to_pass: true
 | 
			
		||||
 | 
			
		||||
comment:
 | 
			
		||||
  behavior: default
 | 
			
		||||
  layout: reach,diff,flags,tree,reach
 | 
			
		||||
  show_carryforward_flags: false
 | 
			
		||||
 | 
			
		||||
coverage:
 | 
			
		||||
  range: "70..85"
 | 
			
		||||
  precision: 1
 | 
			
		||||
  round: nearest
 | 
			
		||||
  status:
 | 
			
		||||
    project:
 | 
			
		||||
      default:
 | 
			
		||||
        target: 60%
 | 
			
		||||
        target: 75%
 | 
			
		||||
        threshold: 2%
 | 
			
		||||
    patch:
 | 
			
		||||
      default:
 | 
			
		||||
        target: auto
 | 
			
		||||
        threshold: 2%
 | 
			
		||||
    changes: false
 | 
			
		||||
 | 
			
		||||
github_checks:
 | 
			
		||||
  annotations: true
 | 
			
		||||
 | 
			
		||||
parsers:
 | 
			
		||||
  cobertura:
 | 
			
		||||
    partials_as_hits: true
 | 
			
		||||
    handle_missing_conditions : true
 | 
			
		||||
 | 
			
		||||
slack_app: false
 | 
			
		||||
 | 
			
		||||
ignore:
 | 
			
		||||
  - "src/test/"
 | 
			
		||||
  - "include/xrpl/beast/test/"
 | 
			
		||||
  - "include/xrpl/beast/unit_test/"
 | 
			
		||||
 
 | 
			
		||||
@@ -2,3 +2,12 @@
 | 
			
		||||
# To use it by default in git blame:
 | 
			
		||||
# git config blame.ignoreRevsFile .git-blame-ignore-revs
 | 
			
		||||
50760c693510894ca368e90369b0cc2dabfd07f3
 | 
			
		||||
e2384885f5f630c8f0ffe4bf21a169b433a16858
 | 
			
		||||
241b9ddde9e11beb7480600fd5ed90e1ef109b21
 | 
			
		||||
760f16f56835663d9286bd29294d074de26a7ba6
 | 
			
		||||
0eebe6a5f4246fced516d52b83ec4e7f47373edd
 | 
			
		||||
2189cc950c0cebb89e4e2fa3b2d8817205bf7cef
 | 
			
		||||
b9d007813378ad0ff45660dc07285b823c7e9855
 | 
			
		||||
fe9a5365b8a52d4acc42eb27369247e6f238a4f9
 | 
			
		||||
9a93577314e6a8d4b4a8368cc9d2b15a5d8303e8
 | 
			
		||||
552377c76f55b403a1c876df873a23d780fcc81c
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								.github/CODEOWNERS
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								.github/CODEOWNERS
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
# Allow anyone to review any change by default.
 | 
			
		||||
*
 | 
			
		||||
 | 
			
		||||
# Require the rpc-reviewers team to review changes to the rpc code.
 | 
			
		||||
include/xrpl/protocol/ @xrplf/rpc-reviewers
 | 
			
		||||
src/libxrpl/protocol/ @xrplf/rpc-reviewers
 | 
			
		||||
src/xrpld/rpc/ @xrplf/rpc-reviewers
 | 
			
		||||
src/xrpld/app/misc/ @xrplf/rpc-reviewers
 | 
			
		||||
							
								
								
									
										2
									
								
								.github/actions/build/action.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/actions/build/action.yml
									
									
									
									
										vendored
									
									
								
							@@ -20,6 +20,8 @@ runs:
 | 
			
		||||
          ${{ inputs.generator && format('-G "{0}"', inputs.generator) || '' }} \
 | 
			
		||||
          -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake \
 | 
			
		||||
          -DCMAKE_BUILD_TYPE=${{ inputs.configuration }} \
 | 
			
		||||
          -Dtests=TRUE \
 | 
			
		||||
          -Dxrpld=TRUE \
 | 
			
		||||
          ${{ inputs.cmake-args }} \
 | 
			
		||||
          ..
 | 
			
		||||
    - name: build
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										31
									
								
								.github/actions/dependencies/action.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										31
									
								
								.github/actions/dependencies/action.yml
									
									
									
									
										vendored
									
									
								
							@@ -12,8 +12,37 @@ runs:
 | 
			
		||||
    - name: export custom recipes
 | 
			
		||||
      shell: bash
 | 
			
		||||
      run: |
 | 
			
		||||
        conan config set general.revisions_enabled=1
 | 
			
		||||
        conan export external/snappy snappy/1.1.10@
 | 
			
		||||
        conan export external/rocksdb rocksdb/9.7.3@
 | 
			
		||||
        conan export external/soci soci/4.0.3@
 | 
			
		||||
        conan export external/nudb nudb/2.0.8@
 | 
			
		||||
    - name: add Ripple Conan remote
 | 
			
		||||
      shell: bash
 | 
			
		||||
      run: |
 | 
			
		||||
        conan remote list
 | 
			
		||||
        conan remote remove ripple || true
 | 
			
		||||
        # Do not quote the URL. An empty string will be accepted (with
 | 
			
		||||
        # a non-fatal warning), but a missing argument will not.
 | 
			
		||||
        conan remote add ripple ${{ env.CONAN_URL }} --insert 0
 | 
			
		||||
    - name: try to authenticate to Ripple Conan remote
 | 
			
		||||
      id: remote
 | 
			
		||||
      shell: bash
 | 
			
		||||
      run: |
 | 
			
		||||
        # `conan user` implicitly uses the environment variables
 | 
			
		||||
        # CONAN_LOGIN_USERNAME_<REMOTE> and CONAN_PASSWORD_<REMOTE>.
 | 
			
		||||
        # https://docs.conan.io/1/reference/commands/misc/user.html#using-environment-variables
 | 
			
		||||
        # https://docs.conan.io/1/reference/env_vars.html#conan-login-username-conan-login-username-remote-name
 | 
			
		||||
        # https://docs.conan.io/1/reference/env_vars.html#conan-password-conan-password-remote-name
 | 
			
		||||
        echo outcome=$(conan user --remote ripple --password >&2 \
 | 
			
		||||
          && echo success || echo failure) | tee ${GITHUB_OUTPUT}
 | 
			
		||||
    - name: list missing binaries
 | 
			
		||||
      id: binaries
 | 
			
		||||
      shell: bash
 | 
			
		||||
      # Print the list of dependencies that would need to be built locally.
 | 
			
		||||
      # A non-empty list means we have "failed" to cache binaries remotely.
 | 
			
		||||
      run: |
 | 
			
		||||
        echo missing=$(conan info . --build missing --settings build_type=${{ inputs.configuration }} --json 2>/dev/null  | grep '^\[') | tee ${GITHUB_OUTPUT}
 | 
			
		||||
    - name: install dependencies
 | 
			
		||||
      shell: bash
 | 
			
		||||
      run: |
 | 
			
		||||
@@ -22,5 +51,7 @@ runs:
 | 
			
		||||
        conan install \
 | 
			
		||||
          --output-folder . \
 | 
			
		||||
          --build missing \
 | 
			
		||||
          --options tests=True \
 | 
			
		||||
          --options xrpld=True \
 | 
			
		||||
          --settings build_type=${{ inputs.configuration }} \
 | 
			
		||||
          ..
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								.github/pull_request_template.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/pull_request_template.md
									
									
									
									
										vendored
									
									
								
							@@ -1,6 +1,12 @@
 | 
			
		||||
<!--
 | 
			
		||||
This PR template helps you to write a good pull request description.
 | 
			
		||||
Please feel free to include additional useful information even beyond what is requested below.
 | 
			
		||||
 | 
			
		||||
If your branch is on a personal fork and has a name that allows it to
 | 
			
		||||
run CI build/test jobs (e.g. "ci/foo"), remember to rename it BEFORE
 | 
			
		||||
opening the PR.  This avoids unnecessary redundant test runs. Renaming
 | 
			
		||||
the branch after opening the PR will close the PR.
 | 
			
		||||
https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-branches-in-your-repository/renaming-a-branch
 | 
			
		||||
-->
 | 
			
		||||
 | 
			
		||||
## High Level Overview of Change
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										108
									
								
								.github/workflows/clang-format.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										108
									
								
								.github/workflows/clang-format.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,61 +1,63 @@
 | 
			
		||||
name: clang-format
 | 
			
		||||
 | 
			
		||||
on: [push, pull_request]
 | 
			
		||||
on:
 | 
			
		||||
  push:
 | 
			
		||||
  pull_request:
 | 
			
		||||
    types: [opened, reopened, synchronize, ready_for_review]
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  check:
 | 
			
		||||
    runs-on: ubuntu-20.04
 | 
			
		||||
    if: ${{ github.event_name == 'push' || github.event.pull_request.draft != true || contains(github.event.pull_request.labels.*.name, 'DraftRunCI') }}
 | 
			
		||||
    runs-on: ubuntu-24.04
 | 
			
		||||
    env:
 | 
			
		||||
      CLANG_VERSION: 10
 | 
			
		||||
      CLANG_VERSION: 18
 | 
			
		||||
    steps:
 | 
			
		||||
    - uses: actions/checkout@v3
 | 
			
		||||
    - name: Install clang-format
 | 
			
		||||
      run: |
 | 
			
		||||
        codename=$( lsb_release --codename --short )
 | 
			
		||||
        sudo tee /etc/apt/sources.list.d/llvm.list >/dev/null <<EOF
 | 
			
		||||
        deb http://apt.llvm.org/${codename}/ llvm-toolchain-${codename}-${CLANG_VERSION} main
 | 
			
		||||
        deb-src http://apt.llvm.org/${codename}/ llvm-toolchain-${codename}-${CLANG_VERSION} main
 | 
			
		||||
        EOF
 | 
			
		||||
        wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add
 | 
			
		||||
        sudo apt-get update
 | 
			
		||||
        sudo apt-get install clang-format-${CLANG_VERSION}
 | 
			
		||||
    - name: Format src/ripple
 | 
			
		||||
      run: find src/ripple -type f \( -name '*.cpp' -o -name '*.h' -o -name '*.ipp' \) -print0 | xargs -0 clang-format-${CLANG_VERSION} -i
 | 
			
		||||
    - name: Format src/test
 | 
			
		||||
      run: find src/test -type f \( -name '*.cpp' -o -name '*.h' -o -name '*.ipp' \) -print0 | xargs -0 clang-format-${CLANG_VERSION} -i
 | 
			
		||||
    - name: Check for differences
 | 
			
		||||
      id: assert
 | 
			
		||||
      run: |
 | 
			
		||||
        set -o pipefail
 | 
			
		||||
        git diff --exit-code | tee "clang-format.patch"
 | 
			
		||||
    - name: Upload patch
 | 
			
		||||
      if: failure() && steps.assert.outcome == 'failure'
 | 
			
		||||
      uses: actions/upload-artifact@v2
 | 
			
		||||
      continue-on-error: true
 | 
			
		||||
      with:
 | 
			
		||||
        name: clang-format.patch
 | 
			
		||||
        if-no-files-found: ignore
 | 
			
		||||
        path: clang-format.patch
 | 
			
		||||
    - name: What happened?
 | 
			
		||||
      if: failure() && steps.assert.outcome == 'failure'
 | 
			
		||||
      env:
 | 
			
		||||
        PREAMBLE: |
 | 
			
		||||
          If you are reading this, you are looking at a failed Github Actions
 | 
			
		||||
          job.  That means you pushed one or more files that did not conform
 | 
			
		||||
          to the formatting specified in .clang-format. That may be because
 | 
			
		||||
          you neglected to run 'git clang-format' or 'clang-format' before
 | 
			
		||||
          committing, or that your version of clang-format has an
 | 
			
		||||
          incompatibility with the one on this
 | 
			
		||||
          machine, which is:
 | 
			
		||||
        SUGGESTION: |
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
      - name: Install clang-format
 | 
			
		||||
        run: |
 | 
			
		||||
          codename=$( lsb_release --codename --short )
 | 
			
		||||
          sudo tee /etc/apt/sources.list.d/llvm.list >/dev/null <<EOF
 | 
			
		||||
          deb http://apt.llvm.org/${codename}/ llvm-toolchain-${codename}-${CLANG_VERSION} main
 | 
			
		||||
          deb-src http://apt.llvm.org/${codename}/ llvm-toolchain-${codename}-${CLANG_VERSION} main
 | 
			
		||||
          EOF
 | 
			
		||||
          wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add
 | 
			
		||||
          sudo apt-get update
 | 
			
		||||
          sudo apt-get install clang-format-${CLANG_VERSION}
 | 
			
		||||
      - name: Format first-party sources
 | 
			
		||||
        run: find include src tests -type f \( -name '*.cpp' -o -name '*.hpp' -o -name '*.h' -o -name '*.ipp' \) -exec clang-format-${CLANG_VERSION} -i {} +
 | 
			
		||||
      - name: Check for differences
 | 
			
		||||
        id: assert
 | 
			
		||||
        run: |
 | 
			
		||||
          set -o pipefail
 | 
			
		||||
          git diff --exit-code | tee "clang-format.patch"
 | 
			
		||||
      - name: Upload patch
 | 
			
		||||
        if: failure() && steps.assert.outcome == 'failure'
 | 
			
		||||
        uses: actions/upload-artifact@v4
 | 
			
		||||
        continue-on-error: true
 | 
			
		||||
        with:
 | 
			
		||||
          name: clang-format.patch
 | 
			
		||||
          if-no-files-found: ignore
 | 
			
		||||
          path: clang-format.patch
 | 
			
		||||
      - name: What happened?
 | 
			
		||||
        if: failure() && steps.assert.outcome == 'failure'
 | 
			
		||||
        env:
 | 
			
		||||
          PREAMBLE: |
 | 
			
		||||
            If you are reading this, you are looking at a failed Github Actions
 | 
			
		||||
            job.  That means you pushed one or more files that did not conform
 | 
			
		||||
            to the formatting specified in .clang-format. That may be because
 | 
			
		||||
            you neglected to run 'git clang-format' or 'clang-format' before
 | 
			
		||||
            committing, or that your version of clang-format has an
 | 
			
		||||
            incompatibility with the one on this
 | 
			
		||||
            machine, which is:
 | 
			
		||||
          SUGGESTION: |
 | 
			
		||||
 | 
			
		||||
          To fix it, you can do one of two things:
 | 
			
		||||
          1. Download and apply the patch generated as an artifact of this
 | 
			
		||||
             job to your repo, commit, and push.
 | 
			
		||||
          2. Run 'git-clang-format --extensions c,cpp,h,cxx,ipp develop'
 | 
			
		||||
             in your repo, commit, and push.
 | 
			
		||||
      run: |
 | 
			
		||||
        echo "${PREAMBLE}"
 | 
			
		||||
        clang-format-${CLANG_VERSION} --version
 | 
			
		||||
        echo "${SUGGESTION}"
 | 
			
		||||
        exit 1
 | 
			
		||||
            To fix it, you can do one of two things:
 | 
			
		||||
            1. Download and apply the patch generated as an artifact of this
 | 
			
		||||
               job to your repo, commit, and push.
 | 
			
		||||
            2. Run 'git-clang-format --extensions cpp,h,hpp,ipp develop'
 | 
			
		||||
               in your repo, commit, and push.
 | 
			
		||||
        run: |
 | 
			
		||||
          echo "${PREAMBLE}"
 | 
			
		||||
          clang-format-${CLANG_VERSION} --version
 | 
			
		||||
          echo "${SUGGESTION}"
 | 
			
		||||
          exit 1
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								.github/workflows/doxygen.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/doxygen.yml
									
									
									
									
										vendored
									
									
								
							@@ -4,20 +4,20 @@ on:
 | 
			
		||||
  push:
 | 
			
		||||
    branches:
 | 
			
		||||
      - develop
 | 
			
		||||
      - doxygen
 | 
			
		||||
concurrency:
 | 
			
		||||
  group: ${{ github.workflow }}-${{ github.ref }}
 | 
			
		||||
  cancel-in-progress: true
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  job:
 | 
			
		||||
  documentation:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    permissions:
 | 
			
		||||
      contents: write
 | 
			
		||||
    container:
 | 
			
		||||
      image: docker://rippleci/rippled-ci-builder:2944b78d22db
 | 
			
		||||
    container: ghcr.io/xrplf/rippled-build-ubuntu:aaf5e3e
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: checkout
 | 
			
		||||
        uses: actions/checkout@v3
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
      - name: check environment
 | 
			
		||||
        run: |
 | 
			
		||||
          echo ${PATH} | tr ':' '\n'
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										78
									
								
								.github/workflows/levelization.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										78
									
								
								.github/workflows/levelization.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,49 +1,53 @@
 | 
			
		||||
name: levelization
 | 
			
		||||
 | 
			
		||||
on: [push, pull_request]
 | 
			
		||||
on:
 | 
			
		||||
  push:
 | 
			
		||||
  pull_request:
 | 
			
		||||
    types: [opened, reopened, synchronize, ready_for_review]
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  check:
 | 
			
		||||
    if: ${{ github.event_name == 'push' || github.event.pull_request.draft != true || contains(github.event.pull_request.labels.*.name, 'DraftRunCI') }}
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    env:
 | 
			
		||||
      CLANG_VERSION: 10
 | 
			
		||||
    steps:
 | 
			
		||||
    - uses: actions/checkout@v3
 | 
			
		||||
    - name: Check levelization
 | 
			
		||||
      run: Builds/levelization/levelization.sh
 | 
			
		||||
    - name: Check for differences
 | 
			
		||||
      id: assert
 | 
			
		||||
      run: |
 | 
			
		||||
        set -o pipefail
 | 
			
		||||
        git diff --exit-code | tee "levelization.patch"
 | 
			
		||||
    - name: Upload patch
 | 
			
		||||
      if: failure() && steps.assert.outcome == 'failure'
 | 
			
		||||
      uses: actions/upload-artifact@v2
 | 
			
		||||
      continue-on-error: true
 | 
			
		||||
      with:
 | 
			
		||||
        name: levelization.patch
 | 
			
		||||
        if-no-files-found: ignore
 | 
			
		||||
        path: levelization.patch
 | 
			
		||||
    - name: What happened?
 | 
			
		||||
      if: failure() && steps.assert.outcome == 'failure'
 | 
			
		||||
      env:
 | 
			
		||||
        MESSAGE: |
 | 
			
		||||
          If you are reading this, you are looking at a failed Github
 | 
			
		||||
          Actions job. That means you changed the dependency relationships
 | 
			
		||||
          between the modules in rippled. That may be an improvement or a
 | 
			
		||||
          regression. This check doesn't judge.
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
      - name: Check levelization
 | 
			
		||||
        run: Builds/levelization/levelization.sh
 | 
			
		||||
      - name: Check for differences
 | 
			
		||||
        id: assert
 | 
			
		||||
        run: |
 | 
			
		||||
          set -o pipefail
 | 
			
		||||
          git diff --exit-code | tee "levelization.patch"
 | 
			
		||||
      - name: Upload patch
 | 
			
		||||
        if: failure() && steps.assert.outcome == 'failure'
 | 
			
		||||
        uses: actions/upload-artifact@v4
 | 
			
		||||
        continue-on-error: true
 | 
			
		||||
        with:
 | 
			
		||||
          name: levelization.patch
 | 
			
		||||
          if-no-files-found: ignore
 | 
			
		||||
          path: levelization.patch
 | 
			
		||||
      - name: What happened?
 | 
			
		||||
        if: failure() && steps.assert.outcome == 'failure'
 | 
			
		||||
        env:
 | 
			
		||||
          MESSAGE: |
 | 
			
		||||
            If you are reading this, you are looking at a failed Github
 | 
			
		||||
            Actions job. That means you changed the dependency relationships
 | 
			
		||||
            between the modules in rippled. That may be an improvement or a
 | 
			
		||||
            regression. This check doesn't judge.
 | 
			
		||||
 | 
			
		||||
          A rule of thumb, though, is that if your changes caused
 | 
			
		||||
          something to be removed from loops.txt, that's probably an
 | 
			
		||||
          improvement. If something was added, it's probably a regression.
 | 
			
		||||
            A rule of thumb, though, is that if your changes caused
 | 
			
		||||
            something to be removed from loops.txt, that's probably an
 | 
			
		||||
            improvement. If something was added, it's probably a regression.
 | 
			
		||||
 | 
			
		||||
          To fix it, you can do one of two things:
 | 
			
		||||
          1. Download and apply the patch generated as an artifact of this
 | 
			
		||||
             job to your repo, commit, and push.
 | 
			
		||||
          2. Run './Builds/levelization/levelization.sh' in your repo,
 | 
			
		||||
             commit, and push.
 | 
			
		||||
            To fix it, you can do one of two things:
 | 
			
		||||
            1. Download and apply the patch generated as an artifact of this
 | 
			
		||||
               job to your repo, commit, and push.
 | 
			
		||||
            2. Run './Builds/levelization/levelization.sh' in your repo,
 | 
			
		||||
               commit, and push.
 | 
			
		||||
 | 
			
		||||
          See Builds/levelization/README.md for more info.
 | 
			
		||||
      run: |
 | 
			
		||||
        echo "${MESSAGE}"
 | 
			
		||||
        exit 1
 | 
			
		||||
            See Builds/levelization/README.md for more info.
 | 
			
		||||
        run: |
 | 
			
		||||
          echo "${MESSAGE}"
 | 
			
		||||
          exit 1
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										91
									
								
								.github/workflows/libxrpl.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								.github/workflows/libxrpl.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,91 @@
 | 
			
		||||
name: Check libXRPL compatibility with Clio
 | 
			
		||||
env:
 | 
			
		||||
  CONAN_URL: http://18.143.149.228:8081/artifactory/api/conan/dev
 | 
			
		||||
  CONAN_LOGIN_USERNAME_RIPPLE: ${{ secrets.CONAN_USERNAME }}
 | 
			
		||||
  CONAN_PASSWORD_RIPPLE: ${{ secrets.CONAN_TOKEN }}
 | 
			
		||||
on:
 | 
			
		||||
  pull_request:
 | 
			
		||||
    paths:
 | 
			
		||||
      - 'src/libxrpl/protocol/BuildInfo.cpp'
 | 
			
		||||
      - '.github/workflows/libxrpl.yml'
 | 
			
		||||
    types: [opened, reopened, synchronize, ready_for_review]
 | 
			
		||||
concurrency:
 | 
			
		||||
  group: ${{ github.workflow }}-${{ github.ref }}
 | 
			
		||||
  cancel-in-progress: true
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  publish:
 | 
			
		||||
    if: ${{ github.event_name == 'push' || github.event.pull_request.draft != true || contains(github.event.pull_request.labels.*.name, 'DraftRunCI') }}
 | 
			
		||||
    name: Publish libXRPL
 | 
			
		||||
    outputs:
 | 
			
		||||
      outcome: ${{ steps.upload.outputs.outcome }}
 | 
			
		||||
      version: ${{ steps.version.outputs.version }}
 | 
			
		||||
      channel: ${{ steps.channel.outputs.channel }}
 | 
			
		||||
    runs-on: [self-hosted, heavy]
 | 
			
		||||
    container: ghcr.io/xrplf/rippled-build-ubuntu:aaf5e3e
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Wait for essential checks to succeed
 | 
			
		||||
        uses: lewagon/wait-on-check-action@v1.3.4
 | 
			
		||||
        with:
 | 
			
		||||
          ref: ${{ github.event.pull_request.head.sha || github.sha }}
 | 
			
		||||
          running-workflow-name: wait-for-check-regexp
 | 
			
		||||
          check-regexp: '(dependencies|test).*linux.*' # Ignore windows and mac tests but make sure linux passes
 | 
			
		||||
          repo-token: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
          wait-interval: 10
 | 
			
		||||
      - name: Checkout
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
      - name: Generate channel
 | 
			
		||||
        id: channel
 | 
			
		||||
        shell: bash
 | 
			
		||||
        run: |
 | 
			
		||||
          echo channel="clio/pr_${{ github.event.pull_request.number }}" | tee ${GITHUB_OUTPUT}
 | 
			
		||||
      - name: Export new package
 | 
			
		||||
        shell: bash
 | 
			
		||||
        run: |
 | 
			
		||||
          conan export . ${{ steps.channel.outputs.channel }}
 | 
			
		||||
      - name: Add Ripple Conan remote
 | 
			
		||||
        shell: bash
 | 
			
		||||
        run: |
 | 
			
		||||
          conan remote list
 | 
			
		||||
          conan remote remove ripple || true
 | 
			
		||||
          # Do not quote the URL. An empty string will be accepted (with a non-fatal warning), but a missing argument will not.
 | 
			
		||||
          conan remote add ripple ${{ env.CONAN_URL }} --insert 0
 | 
			
		||||
      - name: Parse new version
 | 
			
		||||
        id: version
 | 
			
		||||
        shell: bash
 | 
			
		||||
        run: |
 | 
			
		||||
          echo version="$(cat src/libxrpl/protocol/BuildInfo.cpp | grep "versionString =" \
 | 
			
		||||
            | awk -F '"' '{print $2}')" | tee ${GITHUB_OUTPUT}
 | 
			
		||||
      - name: Try to authenticate to Ripple Conan remote
 | 
			
		||||
        id: remote
 | 
			
		||||
        shell: bash
 | 
			
		||||
        run: |
 | 
			
		||||
          # `conan user` implicitly uses the environment variables CONAN_LOGIN_USERNAME_<REMOTE> and CONAN_PASSWORD_<REMOTE>.
 | 
			
		||||
          # https://docs.conan.io/1/reference/commands/misc/user.html#using-environment-variables
 | 
			
		||||
          # https://docs.conan.io/1/reference/env_vars.html#conan-login-username-conan-login-username-remote-name
 | 
			
		||||
          # https://docs.conan.io/1/reference/env_vars.html#conan-password-conan-password-remote-name
 | 
			
		||||
          echo outcome=$(conan user --remote ripple --password >&2 \
 | 
			
		||||
            && echo success || echo failure) | tee ${GITHUB_OUTPUT}
 | 
			
		||||
      - name: Upload new package
 | 
			
		||||
        id: upload
 | 
			
		||||
        if: (steps.remote.outputs.outcome == 'success')
 | 
			
		||||
        shell: bash
 | 
			
		||||
        run: |
 | 
			
		||||
          echo "conan upload version ${{ steps.version.outputs.version }} on channel ${{ steps.channel.outputs.channel }}"
 | 
			
		||||
          echo outcome=$(conan upload xrpl/${{ steps.version.outputs.version }}@${{ steps.channel.outputs.channel }} --remote ripple --confirm >&2 \
 | 
			
		||||
            && echo success || echo failure) | tee ${GITHUB_OUTPUT}
 | 
			
		||||
  notify_clio:
 | 
			
		||||
    name: Notify Clio
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    needs: publish
 | 
			
		||||
    env:
 | 
			
		||||
      GH_TOKEN: ${{ secrets.CLIO_NOTIFY_TOKEN }}
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Notify Clio about new version
 | 
			
		||||
        if: (needs.publish.outputs.outcome == 'success')
 | 
			
		||||
        shell: bash
 | 
			
		||||
        run: |
 | 
			
		||||
          gh api --method POST -H "Accept: application/vnd.github+json" -H "X-GitHub-Api-Version: 2022-11-28" \
 | 
			
		||||
          /repos/xrplf/clio/dispatches -f "event_type=check_libxrpl" \
 | 
			
		||||
          -F "client_payload[version]=${{ needs.publish.outputs.version }}@${{ needs.publish.outputs.channel }}" \
 | 
			
		||||
          -F "client_payload[pr]=${{ github.event.pull_request.number }}"
 | 
			
		||||
							
								
								
									
										65
									
								
								.github/workflows/macos.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										65
									
								
								.github/workflows/macos.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,5 +1,17 @@
 | 
			
		||||
name: macos
 | 
			
		||||
on: [push, pull_request]
 | 
			
		||||
on:
 | 
			
		||||
  pull_request:
 | 
			
		||||
    types: [opened, reopened, synchronize, ready_for_review]
 | 
			
		||||
  push:
 | 
			
		||||
    # If the branches list is ever changed, be sure to change it on all
 | 
			
		||||
    # build/test jobs (nix, macos, windows, instrumentation)
 | 
			
		||||
    branches:
 | 
			
		||||
      # Always build the package branches
 | 
			
		||||
      - develop
 | 
			
		||||
      - release
 | 
			
		||||
      - master
 | 
			
		||||
      # Branches that opt-in to running
 | 
			
		||||
      - 'ci/**'
 | 
			
		||||
concurrency:
 | 
			
		||||
  group: ${{ github.workflow }}-${{ github.ref }}
 | 
			
		||||
  cancel-in-progress: true
 | 
			
		||||
@@ -7,6 +19,7 @@ concurrency:
 | 
			
		||||
jobs:
 | 
			
		||||
 | 
			
		||||
  test:
 | 
			
		||||
    if: ${{ github.event_name == 'push' || github.event.pull_request.draft != true || contains(github.event.pull_request.labels.*.name, 'DraftRunCI') }}
 | 
			
		||||
    strategy:
 | 
			
		||||
      matrix:
 | 
			
		||||
        platform:
 | 
			
		||||
@@ -22,23 +35,55 @@ jobs:
 | 
			
		||||
      NUM_PROCESSORS: 12
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: checkout
 | 
			
		||||
        uses: actions/checkout@v3
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
      - name: install Conan
 | 
			
		||||
        run: |
 | 
			
		||||
          brew install conan@1
 | 
			
		||||
          echo '/opt/homebrew/opt/conan@1/bin' >> $GITHUB_PATH
 | 
			
		||||
      - name: install Ninja
 | 
			
		||||
        if: matrix.generator == 'Ninja'
 | 
			
		||||
        run: brew install ninja
 | 
			
		||||
      - name: install python
 | 
			
		||||
        run: | 
 | 
			
		||||
          if which python > /dev/null 2>&1; then
 | 
			
		||||
              echo "Python executable exists"
 | 
			
		||||
          else
 | 
			
		||||
              brew install python@3.13
 | 
			
		||||
              ln -s /opt/homebrew/bin/python3 /opt/homebrew/bin/python
 | 
			
		||||
          fi
 | 
			
		||||
      - name: install cmake
 | 
			
		||||
        run: |
 | 
			
		||||
          if which cmake > /dev/null 2>&1; then
 | 
			
		||||
              echo "cmake executable exists"
 | 
			
		||||
          else
 | 
			
		||||
              brew install cmake
 | 
			
		||||
          fi
 | 
			
		||||
      - name: install nproc
 | 
			
		||||
        run: |
 | 
			
		||||
          brew install coreutils
 | 
			
		||||
      - name: check environment
 | 
			
		||||
        run: |
 | 
			
		||||
          env | sort
 | 
			
		||||
          echo ${PATH} | tr ':' '\n'
 | 
			
		||||
          python --version
 | 
			
		||||
          conan --version
 | 
			
		||||
          cmake --version
 | 
			
		||||
          env | sort
 | 
			
		||||
          nproc --version
 | 
			
		||||
          echo -n "nproc returns: "
 | 
			
		||||
          nproc
 | 
			
		||||
          system_profiler SPHardwareDataType
 | 
			
		||||
          sysctl -n hw.logicalcpu
 | 
			
		||||
          clang --version
 | 
			
		||||
      - name: configure Conan
 | 
			
		||||
        run : |
 | 
			
		||||
          conan profile get env.CXXFLAGS default || true
 | 
			
		||||
          conan profile update 'conf.tools.build:cxxflags+=["-DBOOST_ASIO_DISABLE_CONCEPTS"]' default
 | 
			
		||||
      - name: dependencies
 | 
			
		||||
          conan profile new default --detect || true
 | 
			
		||||
          conan profile update settings.compiler.cppstd=20 default
 | 
			
		||||
      - name: build dependencies
 | 
			
		||||
        uses: ./.github/actions/dependencies
 | 
			
		||||
        env:
 | 
			
		||||
          CONAN_URL: http://18.143.149.228:8081/artifactory/api/conan/conan-non-prod
 | 
			
		||||
          CONAN_LOGIN_USERNAME_RIPPLE: ${{ secrets.CONAN_USERNAME }}
 | 
			
		||||
          CONAN_PASSWORD_RIPPLE: ${{ secrets.CONAN_TOKEN }}
 | 
			
		||||
        with:
 | 
			
		||||
          configuration: ${{ matrix.configuration }}
 | 
			
		||||
      - name: build
 | 
			
		||||
@@ -46,6 +91,12 @@ jobs:
 | 
			
		||||
        with:
 | 
			
		||||
          generator: ${{ matrix.generator }}
 | 
			
		||||
          configuration: ${{ matrix.configuration }}
 | 
			
		||||
          cmake-args: "-Dassert=TRUE -Dwerr=TRUE ${{ matrix.cmake-args }}"
 | 
			
		||||
      - name: test
 | 
			
		||||
        run: |
 | 
			
		||||
          ${build_dir}/rippled --unittest
 | 
			
		||||
          n=$(nproc)
 | 
			
		||||
          echo "Using $n test jobs"
 | 
			
		||||
 | 
			
		||||
          cd ${build_dir}
 | 
			
		||||
          ./rippled --unittest --unittest-jobs $n
 | 
			
		||||
          ctest -j $n --output-on-failure
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										60
									
								
								.github/workflows/missing-commits.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								.github/workflows/missing-commits.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,60 @@
 | 
			
		||||
name: missing-commits
 | 
			
		||||
 | 
			
		||||
on:
 | 
			
		||||
  push:
 | 
			
		||||
    branches:
 | 
			
		||||
      # Only check that the branches are up to date when updating the
 | 
			
		||||
      # relevant branches.
 | 
			
		||||
      - develop
 | 
			
		||||
      - release
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  up_to_date:
 | 
			
		||||
    runs-on: ubuntu-24.04
 | 
			
		||||
    steps:
 | 
			
		||||
    - uses: actions/checkout@v4
 | 
			
		||||
      with:
 | 
			
		||||
        fetch-depth: 0
 | 
			
		||||
    - name: Check for missing commits
 | 
			
		||||
      id: commits
 | 
			
		||||
      env:
 | 
			
		||||
        SUGGESTION: |
 | 
			
		||||
 | 
			
		||||
          If you are reading this, then the commits indicated above are
 | 
			
		||||
          missing from "develop" and/or "release". Do a reverse-merge
 | 
			
		||||
          as soon as possible. See CONTRIBUTING.md for instructions.
 | 
			
		||||
      run: |
 | 
			
		||||
        set -o pipefail
 | 
			
		||||
        # Branches ordered by how "canonical" they are. Every commit in
 | 
			
		||||
        # one branch should be in all the branches behind it
 | 
			
		||||
        order=( master release develop )
 | 
			
		||||
        branches=()
 | 
			
		||||
        for branch in "${order[@]}"
 | 
			
		||||
        do
 | 
			
		||||
          # Check that the branches exist so that this job will work on
 | 
			
		||||
          # forked repos, which don't necessarily have master and
 | 
			
		||||
          # release branches.
 | 
			
		||||
          if git ls-remote --exit-code --heads origin \
 | 
			
		||||
            refs/heads/${branch} > /dev/null
 | 
			
		||||
          then
 | 
			
		||||
            branches+=( origin/${branch} )
 | 
			
		||||
          fi
 | 
			
		||||
        done
 | 
			
		||||
 | 
			
		||||
        prior=()
 | 
			
		||||
        for branch in "${branches[@]}"
 | 
			
		||||
        do
 | 
			
		||||
          if [[ ${#prior[@]} -ne 0 ]]
 | 
			
		||||
          then
 | 
			
		||||
            echo "Checking ${prior[@]} for commits missing from ${branch}"
 | 
			
		||||
            git log --oneline --no-merges "${prior[@]}" \
 | 
			
		||||
              ^$branch | tee -a "missing-commits.txt"
 | 
			
		||||
            echo
 | 
			
		||||
          fi
 | 
			
		||||
          prior+=( "${branch}" )
 | 
			
		||||
        done
 | 
			
		||||
        if [[ $( cat missing-commits.txt | wc -l ) -ne 0 ]]
 | 
			
		||||
        then
 | 
			
		||||
          echo "${SUGGESTION}"
 | 
			
		||||
          exit 1
 | 
			
		||||
        fi
 | 
			
		||||
							
								
								
									
										313
									
								
								.github/workflows/nix.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										313
									
								
								.github/workflows/nix.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,12 +1,24 @@
 | 
			
		||||
name: nix
 | 
			
		||||
on: [push, pull_request]
 | 
			
		||||
on:
 | 
			
		||||
  pull_request:
 | 
			
		||||
    types: [opened, reopened, synchronize, ready_for_review]
 | 
			
		||||
  push:
 | 
			
		||||
    # If the branches list is ever changed, be sure to change it on all
 | 
			
		||||
    # build/test jobs (nix, macos, windows)
 | 
			
		||||
    branches:
 | 
			
		||||
      # Always build the package branches
 | 
			
		||||
      - develop
 | 
			
		||||
      - release
 | 
			
		||||
      - master
 | 
			
		||||
      # Branches that opt-in to running
 | 
			
		||||
      - "ci/**"
 | 
			
		||||
concurrency:
 | 
			
		||||
  group: ${{ github.workflow }}-${{ github.ref }}
 | 
			
		||||
  cancel-in-progress: true
 | 
			
		||||
 | 
			
		||||
# This workflow has two job matrixes.
 | 
			
		||||
# They can be considered phases because the second matrix ("test")
 | 
			
		||||
# depends on the first ("dependencies").
 | 
			
		||||
# This workflow has multiple job matrixes.
 | 
			
		||||
# They can be considered phases because most of the matrices ("test",
 | 
			
		||||
# "coverage", "conan", ) depend on the first ("dependencies").
 | 
			
		||||
#
 | 
			
		||||
# The first phase has a job in the matrix for each combination of
 | 
			
		||||
# variables that affects dependency ABI:
 | 
			
		||||
@@ -19,13 +31,16 @@ concurrency:
 | 
			
		||||
# to hold the binaries if they are built locally.
 | 
			
		||||
# We must use the "{upload,download}-artifact" actions instead.
 | 
			
		||||
#
 | 
			
		||||
# The second phase has a job in the matrix for each test configuration.
 | 
			
		||||
# It installs dependency binaries from the cache, whichever was used,
 | 
			
		||||
# and builds and tests rippled.
 | 
			
		||||
# The remaining phases have a job in the matrix for each test
 | 
			
		||||
# configuration. They install dependency binaries from the cache,
 | 
			
		||||
# whichever was used, and build and test rippled.
 | 
			
		||||
#
 | 
			
		||||
# "instrumentation" is independent, but is included here because it also
 | 
			
		||||
# builds on linux in the same "on:" conditions.
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
 | 
			
		||||
  dependencies:
 | 
			
		||||
    if: ${{ github.event_name == 'push' || github.event.pull_request.draft != true || contains(github.event.pull_request.labels.*.name, 'DraftRunCI') }}
 | 
			
		||||
    strategy:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
      matrix:
 | 
			
		||||
@@ -49,21 +64,24 @@ jobs:
 | 
			
		||||
              cc: /usr/bin/clang-14
 | 
			
		||||
              cxx: /usr/bin/clang++-14
 | 
			
		||||
    runs-on: [self-hosted, heavy]
 | 
			
		||||
    container: rippleci/rippled-build-ubuntu:aaf5e3e
 | 
			
		||||
    container: ghcr.io/xrplf/rippled-build-ubuntu:aaf5e3e
 | 
			
		||||
    env:
 | 
			
		||||
      build_dir: .build
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: upgrade conan
 | 
			
		||||
        run: |
 | 
			
		||||
          pip install --upgrade "conan<2"
 | 
			
		||||
      - name: checkout
 | 
			
		||||
        uses: actions/checkout@v3
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
      - name: check environment
 | 
			
		||||
        run: |
 | 
			
		||||
          echo ${PATH} | tr ':' '\n'
 | 
			
		||||
          lsb_release -a || true
 | 
			
		||||
          ${{ matrix.profile.cc }} --version
 | 
			
		||||
          conan --version
 | 
			
		||||
          cmake --version
 | 
			
		||||
          env | sort
 | 
			
		||||
      - name: configure Conan
 | 
			
		||||
        env:
 | 
			
		||||
          CONAN_URL: http://18.143.149.228:8081/artifactory/api/conan/conan-non-prod
 | 
			
		||||
        run: |
 | 
			
		||||
          conan profile new default --detect
 | 
			
		||||
          conan profile update settings.compiler.cppstd=20 default
 | 
			
		||||
@@ -73,41 +91,24 @@ jobs:
 | 
			
		||||
          conan profile update env.CC=${{ matrix.profile.cc }} default
 | 
			
		||||
          conan profile update env.CXX=${{ matrix.profile.cxx }} default
 | 
			
		||||
          conan profile update conf.tools.build:compiler_executables='{"c": "${{ matrix.profile.cc }}", "cpp": "${{ matrix.profile.cxx }}"}' default
 | 
			
		||||
          # Do not quote the URL. An empty string will be accepted (with
 | 
			
		||||
          # a non-fatal warning), but a missing argument will not.
 | 
			
		||||
          conan remote add ripple ${{ env.CONAN_URL }} --insert 0
 | 
			
		||||
      - name: try to authenticate to ripple Conan remote
 | 
			
		||||
        id: remote
 | 
			
		||||
        run: |
 | 
			
		||||
          echo outcome=$(conan user --remote ripple ${{ secrets.CONAN_USERNAME }} --password ${{ secrets.CONAN_TOKEN }} >&2 && echo success || echo failure) | tee ${GITHUB_OUTPUT}
 | 
			
		||||
      - name: archive profile
 | 
			
		||||
        # Create this archive before dependencies are added to the local cache.
 | 
			
		||||
        run: tar -czf conan.tar -C ~/.conan .
 | 
			
		||||
      - name: list missing binaries
 | 
			
		||||
        id: binaries
 | 
			
		||||
        # Print the list of dependencies that would need to be built locally.
 | 
			
		||||
        # A non-empty list means we have "failed" to cache binaries remotely.
 | 
			
		||||
        run: |
 | 
			
		||||
          echo missing=$(conan info . --build missing --settings build_type=${{ matrix.configuration }} --json 2>/dev/null  | grep '^\[') | tee ${GITHUB_OUTPUT}
 | 
			
		||||
      - name: build dependencies
 | 
			
		||||
        if: (steps.binaries.outputs.missing != '[]')
 | 
			
		||||
        uses: ./.github/actions/dependencies
 | 
			
		||||
        env:
 | 
			
		||||
          CONAN_URL: http://18.143.149.228:8081/artifactory/api/conan/conan-non-prod
 | 
			
		||||
          CONAN_LOGIN_USERNAME_RIPPLE: ${{ secrets.CONAN_USERNAME }}
 | 
			
		||||
          CONAN_PASSWORD_RIPPLE: ${{ secrets.CONAN_TOKEN }}
 | 
			
		||||
        with:
 | 
			
		||||
          configuration: ${{ matrix.configuration }}
 | 
			
		||||
      - name: upload dependencies to remote
 | 
			
		||||
        if: (steps.binaries.outputs.missing != '[]') && (steps.remote.outputs.outcome == 'success')
 | 
			
		||||
        run: conan upload --remote ripple '*' --all --parallel --confirm
 | 
			
		||||
      - name: recreate archive with dependencies
 | 
			
		||||
        if: (steps.binaries.outputs.missing != '[]') && (steps.remote.outputs.outcome == 'failure')
 | 
			
		||||
        run: tar -czf conan.tar -C ~/.conan .
 | 
			
		||||
      - name: upload archive
 | 
			
		||||
        uses: actions/upload-artifact@v3
 | 
			
		||||
        uses: actions/upload-artifact@v4
 | 
			
		||||
        with:
 | 
			
		||||
          name: ${{ matrix.platform }}-${{ matrix.compiler }}-${{ matrix.configuration }}
 | 
			
		||||
          path: conan.tar
 | 
			
		||||
          if-no-files-found: error
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  test:
 | 
			
		||||
    strategy:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
@@ -125,12 +126,15 @@ jobs:
 | 
			
		||||
          - "-Dunity=ON"
 | 
			
		||||
    needs: dependencies
 | 
			
		||||
    runs-on: [self-hosted, heavy]
 | 
			
		||||
    container: rippleci/rippled-build-ubuntu:aaf5e3e
 | 
			
		||||
    container: ghcr.io/xrplf/rippled-build-ubuntu:aaf5e3e
 | 
			
		||||
    env:
 | 
			
		||||
      build_dir: .build
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: upgrade conan
 | 
			
		||||
        run: |
 | 
			
		||||
          pip install --upgrade "conan<2"
 | 
			
		||||
      - name: download cache
 | 
			
		||||
        uses: actions/download-artifact@v3
 | 
			
		||||
        uses: actions/download-artifact@v4
 | 
			
		||||
        with:
 | 
			
		||||
          name: ${{ matrix.platform }}-${{ matrix.compiler }}-${{ matrix.configuration }}
 | 
			
		||||
      - name: extract cache
 | 
			
		||||
@@ -139,15 +143,16 @@ jobs:
 | 
			
		||||
          tar -xzf conan.tar -C ~/.conan
 | 
			
		||||
      - name: check environment
 | 
			
		||||
        run: |
 | 
			
		||||
          env | sort
 | 
			
		||||
          echo ${PATH} | tr ':' '\n'
 | 
			
		||||
          conan --version
 | 
			
		||||
          cmake --version
 | 
			
		||||
          env | sort
 | 
			
		||||
          ls ~/.conan
 | 
			
		||||
      - name: checkout
 | 
			
		||||
        uses: actions/checkout@v3
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
      - name: dependencies
 | 
			
		||||
        uses: ./.github/actions/dependencies
 | 
			
		||||
        env:
 | 
			
		||||
          CONAN_URL: http://18.143.149.228:8081/artifactory/api/conan/conan-non-prod
 | 
			
		||||
        with:
 | 
			
		||||
          configuration: ${{ matrix.configuration }}
 | 
			
		||||
      - name: build
 | 
			
		||||
@@ -155,12 +160,68 @@ jobs:
 | 
			
		||||
        with:
 | 
			
		||||
          generator: Ninja
 | 
			
		||||
          configuration: ${{ matrix.configuration }}
 | 
			
		||||
          cmake-args: ${{ matrix.cmake-args }}
 | 
			
		||||
          cmake-args: "-Dassert=TRUE -Dwerr=TRUE ${{ matrix.cmake-args }}"
 | 
			
		||||
      - name: test
 | 
			
		||||
        run: |
 | 
			
		||||
          ${build_dir}/rippled --unittest --unittest-jobs $(nproc)
 | 
			
		||||
 | 
			
		||||
          cd ${build_dir}
 | 
			
		||||
          ./rippled --unittest --unittest-jobs $(nproc)
 | 
			
		||||
          ctest -j $(nproc) --output-on-failure
 | 
			
		||||
 | 
			
		||||
  reference-fee-test:
 | 
			
		||||
    strategy:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
      matrix:
 | 
			
		||||
        platform:
 | 
			
		||||
          - linux
 | 
			
		||||
        compiler:
 | 
			
		||||
          - gcc
 | 
			
		||||
        configuration:
 | 
			
		||||
          - Debug
 | 
			
		||||
        cmake-args:
 | 
			
		||||
          - "-DUNIT_TEST_REFERENCE_FEE=200"
 | 
			
		||||
          - "-DUNIT_TEST_REFERENCE_FEE=1000"
 | 
			
		||||
    needs: dependencies
 | 
			
		||||
    runs-on: [self-hosted, heavy]
 | 
			
		||||
    container: ghcr.io/xrplf/rippled-build-ubuntu:aaf5e3e
 | 
			
		||||
    env:
 | 
			
		||||
      build_dir: .build
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: upgrade conan
 | 
			
		||||
        run: |
 | 
			
		||||
          pip install --upgrade "conan<2"
 | 
			
		||||
      - name: download cache
 | 
			
		||||
        uses: actions/download-artifact@v4
 | 
			
		||||
        with:
 | 
			
		||||
          name: ${{ matrix.platform }}-${{ matrix.compiler }}-${{ matrix.configuration }}
 | 
			
		||||
      - name: extract cache
 | 
			
		||||
        run: |
 | 
			
		||||
          mkdir -p ~/.conan
 | 
			
		||||
          tar -xzf conan.tar -C ~/.conan
 | 
			
		||||
      - name: check environment
 | 
			
		||||
        run: |
 | 
			
		||||
          env | sort
 | 
			
		||||
          echo ${PATH} | tr ':' '\n'
 | 
			
		||||
          conan --version
 | 
			
		||||
          cmake --version
 | 
			
		||||
      - name: checkout
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
      - name: dependencies
 | 
			
		||||
        uses: ./.github/actions/dependencies
 | 
			
		||||
        env:
 | 
			
		||||
          CONAN_URL: http://18.143.149.228:8081/artifactory/api/conan/conan-non-prod
 | 
			
		||||
        with:
 | 
			
		||||
          configuration: ${{ matrix.configuration }}
 | 
			
		||||
      - name: build
 | 
			
		||||
        uses: ./.github/actions/build
 | 
			
		||||
        with:
 | 
			
		||||
          generator: Ninja
 | 
			
		||||
          configuration: ${{ matrix.configuration }}
 | 
			
		||||
          cmake-args: "-Dassert=TRUE -Dwerr=TRUE ${{ matrix.cmake-args }}"
 | 
			
		||||
      - name: test
 | 
			
		||||
        run: |
 | 
			
		||||
          cd ${build_dir}
 | 
			
		||||
          ./rippled --unittest --unittest-jobs $(nproc)
 | 
			
		||||
          ctest -j $(nproc) --output-on-failure
 | 
			
		||||
  coverage:
 | 
			
		||||
    strategy:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
@@ -173,18 +234,23 @@ jobs:
 | 
			
		||||
          - Debug
 | 
			
		||||
    needs: dependencies
 | 
			
		||||
    runs-on: [self-hosted, heavy]
 | 
			
		||||
    container: rippleci/rippled-build-ubuntu:aaf5e3e
 | 
			
		||||
    container: ghcr.io/xrplf/rippled-build-ubuntu:aaf5e3e
 | 
			
		||||
    env:
 | 
			
		||||
      build_dir: .build
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: upgrade conan
 | 
			
		||||
        run: |
 | 
			
		||||
          pip install --upgrade "conan<2"
 | 
			
		||||
      - name: download cache
 | 
			
		||||
        uses: actions/download-artifact@v3
 | 
			
		||||
        uses: actions/download-artifact@v4
 | 
			
		||||
        with:
 | 
			
		||||
          name: ${{ matrix.platform }}-${{ matrix.compiler }}-${{ matrix.configuration }}
 | 
			
		||||
      - name: extract cache
 | 
			
		||||
        run: |
 | 
			
		||||
          mkdir -p ~/.conan
 | 
			
		||||
          tar -xzf conan.tar -C ~/.conan
 | 
			
		||||
      - name: install gcovr
 | 
			
		||||
        run: pip install "gcovr>=7,<9"
 | 
			
		||||
      - name: check environment
 | 
			
		||||
        run: |
 | 
			
		||||
          echo ${PATH} | tr ':' '\n'
 | 
			
		||||
@@ -194,9 +260,11 @@ jobs:
 | 
			
		||||
          env | sort
 | 
			
		||||
          ls ~/.conan
 | 
			
		||||
      - name: checkout
 | 
			
		||||
        uses: actions/checkout@v3
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
      - name: dependencies
 | 
			
		||||
        uses: ./.github/actions/dependencies
 | 
			
		||||
        env:
 | 
			
		||||
          CONAN_URL: http://18.143.149.228:8081/artifactory/api/conan/conan-non-prod
 | 
			
		||||
        with:
 | 
			
		||||
          configuration: ${{ matrix.configuration }}
 | 
			
		||||
      - name: build
 | 
			
		||||
@@ -205,30 +273,175 @@ jobs:
 | 
			
		||||
          generator: Ninja
 | 
			
		||||
          configuration: ${{ matrix.configuration }}
 | 
			
		||||
          cmake-args: >-
 | 
			
		||||
            -Dassert=TRUE
 | 
			
		||||
            -Dwerr=TRUE
 | 
			
		||||
            -Dcoverage=ON
 | 
			
		||||
            -Dcoverage_format=xml
 | 
			
		||||
            -DCODE_COVERAGE_VERBOSE=ON
 | 
			
		||||
            -DCMAKE_CXX_FLAGS="-O0"
 | 
			
		||||
            -DCMAKE_C_FLAGS="-O0"
 | 
			
		||||
          cmake-target: coverage
 | 
			
		||||
      - name: build
 | 
			
		||||
      - name: move coverage report
 | 
			
		||||
        shell: bash
 | 
			
		||||
        run: |
 | 
			
		||||
          mv "${build_dir}/coverage.xml" ./
 | 
			
		||||
      - name: archive coverage report
 | 
			
		||||
        uses: actions/upload-artifact@v3
 | 
			
		||||
        uses: actions/upload-artifact@v4
 | 
			
		||||
        with:
 | 
			
		||||
          name: coverage.xml
 | 
			
		||||
          path: coverage.xml
 | 
			
		||||
          retention-days: 30
 | 
			
		||||
      - name: upload coverage report
 | 
			
		||||
        uses: wandalen/wretry.action@v1.3.0
 | 
			
		||||
        uses: wandalen/wretry.action@v1.4.10
 | 
			
		||||
        with:
 | 
			
		||||
          action: codecov/codecov-action@v3
 | 
			
		||||
          action: codecov/codecov-action@v4.5.0
 | 
			
		||||
          with: |
 | 
			
		||||
            files: coverage.xml
 | 
			
		||||
            fail_ci_if_error: true
 | 
			
		||||
            disable_search: true
 | 
			
		||||
            verbose: true
 | 
			
		||||
            plugin: noop
 | 
			
		||||
            token: ${{ secrets.CODECOV_TOKEN }}
 | 
			
		||||
          attempt_limit: 5
 | 
			
		||||
          attempt_delay: 35000 # in milliseconds
 | 
			
		||||
          attempt_delay: 210000 # in milliseconds
 | 
			
		||||
 | 
			
		||||
  conan:
 | 
			
		||||
    needs: dependencies
 | 
			
		||||
    runs-on: [self-hosted, heavy]
 | 
			
		||||
    container: ghcr.io/xrplf/rippled-build-ubuntu:aaf5e3e
 | 
			
		||||
    env:
 | 
			
		||||
      build_dir: .build
 | 
			
		||||
      configuration: Release
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: upgrade conan
 | 
			
		||||
        run: |
 | 
			
		||||
          pip install --upgrade "conan<2"
 | 
			
		||||
      - name: download cache
 | 
			
		||||
        uses: actions/download-artifact@v4
 | 
			
		||||
        with:
 | 
			
		||||
          name: linux-gcc-${{ env.configuration }}
 | 
			
		||||
      - name: extract cache
 | 
			
		||||
        run: |
 | 
			
		||||
          mkdir -p ~/.conan
 | 
			
		||||
          tar -xzf conan.tar -C ~/.conan
 | 
			
		||||
      - name: check environment
 | 
			
		||||
        run: |
 | 
			
		||||
          env | sort
 | 
			
		||||
          echo ${PATH} | tr ':' '\n'
 | 
			
		||||
          conan --version
 | 
			
		||||
          cmake --version
 | 
			
		||||
      - name: checkout
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
      - name: dependencies
 | 
			
		||||
        uses: ./.github/actions/dependencies
 | 
			
		||||
        env:
 | 
			
		||||
          CONAN_URL: http://18.143.149.228:8081/artifactory/api/conan/conan-non-prod
 | 
			
		||||
        with:
 | 
			
		||||
          configuration: ${{ env.configuration }}
 | 
			
		||||
      - name: export
 | 
			
		||||
        run: |
 | 
			
		||||
          version=$(conan inspect --raw version .)
 | 
			
		||||
          reference="xrpl/${version}@local/test"
 | 
			
		||||
          conan remove -f ${reference} || true
 | 
			
		||||
          conan export . local/test
 | 
			
		||||
          echo "reference=${reference}" >> "${GITHUB_ENV}"
 | 
			
		||||
      - name: build
 | 
			
		||||
        run: |
 | 
			
		||||
          cd tests/conan
 | 
			
		||||
          mkdir ${build_dir}
 | 
			
		||||
          cd ${build_dir}
 | 
			
		||||
          conan install .. --output-folder . \
 | 
			
		||||
            --require-override ${reference} --build missing
 | 
			
		||||
          cmake .. \
 | 
			
		||||
            -DCMAKE_TOOLCHAIN_FILE:FILEPATH=./build/${configuration}/generators/conan_toolchain.cmake \
 | 
			
		||||
            -DCMAKE_BUILD_TYPE=${configuration}
 | 
			
		||||
          cmake --build .
 | 
			
		||||
          ./example | grep '^[[:digit:]]\+\.[[:digit:]]\+\.[[:digit:]]\+'
 | 
			
		||||
 | 
			
		||||
  # NOTE we are not using dependencies built above because it lags with
 | 
			
		||||
  # compiler versions. Instrumentation requires clang version 16 or
 | 
			
		||||
  # later
 | 
			
		||||
 | 
			
		||||
  instrumentation-build:
 | 
			
		||||
    if: ${{ github.event_name == 'push' || github.event.pull_request.draft != true || contains(github.event.pull_request.labels.*.name, 'DraftRunCI') }}
 | 
			
		||||
    env:
 | 
			
		||||
      CLANG_RELEASE: 16
 | 
			
		||||
    strategy:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
    runs-on: [self-hosted, heavy]
 | 
			
		||||
    container: debian:bookworm
 | 
			
		||||
    steps:
 | 
			
		||||
        - name: install prerequisites
 | 
			
		||||
          env:
 | 
			
		||||
            DEBIAN_FRONTEND: noninteractive
 | 
			
		||||
          run: |
 | 
			
		||||
            apt-get update
 | 
			
		||||
            apt-get install --yes --no-install-recommends \
 | 
			
		||||
              clang-${CLANG_RELEASE} clang++-${CLANG_RELEASE} \
 | 
			
		||||
              python3-pip python-is-python3 make cmake git wget
 | 
			
		||||
            apt-get clean
 | 
			
		||||
            update-alternatives --install \
 | 
			
		||||
              /usr/bin/clang clang /usr/bin/clang-${CLANG_RELEASE} 100 \
 | 
			
		||||
              --slave /usr/bin/clang++ clang++ /usr/bin/clang++-${CLANG_RELEASE}
 | 
			
		||||
            update-alternatives --auto clang
 | 
			
		||||
            pip install --no-cache --break-system-packages "conan<2"
 | 
			
		||||
 | 
			
		||||
        - name: checkout
 | 
			
		||||
          uses: actions/checkout@v4
 | 
			
		||||
 | 
			
		||||
        - name: prepare environment
 | 
			
		||||
          run: |
 | 
			
		||||
            mkdir ${GITHUB_WORKSPACE}/.build
 | 
			
		||||
            echo "SOURCE_DIR=$GITHUB_WORKSPACE" >> $GITHUB_ENV
 | 
			
		||||
            echo "BUILD_DIR=$GITHUB_WORKSPACE/.build" >> $GITHUB_ENV
 | 
			
		||||
            echo "CC=/usr/bin/clang" >> $GITHUB_ENV
 | 
			
		||||
            echo "CXX=/usr/bin/clang++" >> $GITHUB_ENV
 | 
			
		||||
 | 
			
		||||
        - name: configure Conan
 | 
			
		||||
          run: |
 | 
			
		||||
            conan profile new --detect default
 | 
			
		||||
            conan profile update settings.compiler=clang default
 | 
			
		||||
            conan profile update settings.compiler.version=${CLANG_RELEASE} default
 | 
			
		||||
            conan profile update settings.compiler.libcxx=libstdc++11 default
 | 
			
		||||
            conan profile update settings.compiler.cppstd=20 default
 | 
			
		||||
            conan profile update options.rocksdb=False default
 | 
			
		||||
            conan profile update \
 | 
			
		||||
              'conf.tools.build:compiler_executables={"c": "/usr/bin/clang", "cpp": "/usr/bin/clang++"}' default
 | 
			
		||||
            conan profile update 'env.CXXFLAGS="-DBOOST_ASIO_DISABLE_CONCEPTS"' default
 | 
			
		||||
            conan profile update 'conf.tools.build:cxxflags+=["-DBOOST_ASIO_DISABLE_CONCEPTS"]' default
 | 
			
		||||
            conan export external/snappy snappy/1.1.10@
 | 
			
		||||
            conan export external/soci soci/4.0.3@
 | 
			
		||||
 | 
			
		||||
        - name: build dependencies
 | 
			
		||||
          run: |
 | 
			
		||||
            cd ${BUILD_DIR}
 | 
			
		||||
            conan install ${SOURCE_DIR} \
 | 
			
		||||
              --output-folder ${BUILD_DIR} \
 | 
			
		||||
              --install-folder ${BUILD_DIR} \
 | 
			
		||||
              --build missing \
 | 
			
		||||
              --settings build_type=Debug
 | 
			
		||||
 | 
			
		||||
        - name: build with instrumentation
 | 
			
		||||
          run: |
 | 
			
		||||
            cd ${BUILD_DIR}
 | 
			
		||||
            cmake -S ${SOURCE_DIR} -B ${BUILD_DIR} \
 | 
			
		||||
              -Dvoidstar=ON \
 | 
			
		||||
              -Dtests=ON \
 | 
			
		||||
              -Dxrpld=ON \
 | 
			
		||||
              -DCMAKE_BUILD_TYPE=Debug \
 | 
			
		||||
              -DSECP256K1_BUILD_BENCHMARK=OFF \
 | 
			
		||||
              -DSECP256K1_BUILD_TESTS=OFF \
 | 
			
		||||
              -DSECP256K1_BUILD_EXHAUSTIVE_TESTS=OFF \
 | 
			
		||||
              -DCMAKE_TOOLCHAIN_FILE=${BUILD_DIR}/build/generators/conan_toolchain.cmake
 | 
			
		||||
            cmake --build .  --parallel $(nproc)
 | 
			
		||||
 | 
			
		||||
        - name: verify instrumentation enabled
 | 
			
		||||
          run: |
 | 
			
		||||
            cd ${BUILD_DIR}
 | 
			
		||||
            ./rippled --version | grep libvoidstar
 | 
			
		||||
 | 
			
		||||
        - name: run unit tests
 | 
			
		||||
          run: |
 | 
			
		||||
            cd ${BUILD_DIR}
 | 
			
		||||
            ./rippled -u --unittest-jobs $(( $(nproc)/4 ))
 | 
			
		||||
            ctest -j $(nproc) --output-on-failure
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										87
									
								
								.github/workflows/windows.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										87
									
								
								.github/workflows/windows.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,6 +1,18 @@
 | 
			
		||||
name: windows
 | 
			
		||||
 | 
			
		||||
on: [push, pull_request]
 | 
			
		||||
on:
 | 
			
		||||
  pull_request:
 | 
			
		||||
    types: [opened, reopened, synchronize, ready_for_review]
 | 
			
		||||
  push:
 | 
			
		||||
    # If the branches list is ever changed, be sure to change it on all
 | 
			
		||||
    # build/test jobs (nix, macos, windows, instrumentation)
 | 
			
		||||
    branches:
 | 
			
		||||
      # Always build the package branches
 | 
			
		||||
      - develop
 | 
			
		||||
      - release
 | 
			
		||||
      - master
 | 
			
		||||
      # Branches that opt-in to running
 | 
			
		||||
      - 'ci/**'
 | 
			
		||||
 | 
			
		||||
# https://docs.github.com/en/actions/using-jobs/using-concurrency
 | 
			
		||||
concurrency:
 | 
			
		||||
@@ -10,26 +22,29 @@ concurrency:
 | 
			
		||||
jobs:
 | 
			
		||||
 | 
			
		||||
  test:
 | 
			
		||||
    if: ${{ github.event_name == 'push' || github.event.pull_request.draft != true || contains(github.event.pull_request.labels.*.name, 'DraftRunCI') }}
 | 
			
		||||
    strategy:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
      matrix:
 | 
			
		||||
        generator:
 | 
			
		||||
          - Visual Studio 16 2019
 | 
			
		||||
        version:
 | 
			
		||||
          - generator: Visual Studio 17 2022
 | 
			
		||||
            runs-on: windows-2022
 | 
			
		||||
        configuration:
 | 
			
		||||
          - Release
 | 
			
		||||
          # Github hosted runners tend to hang when running Debug unit tests.
 | 
			
		||||
          # Instead of trying to work around it, disable the Debug job until
 | 
			
		||||
          # something beefier (i.e. a heavy self-hosted runner) becomes
 | 
			
		||||
          # available.
 | 
			
		||||
          # - Debug
 | 
			
		||||
    runs-on: windows-2019
 | 
			
		||||
          - type: Release
 | 
			
		||||
            tests: true
 | 
			
		||||
          - type: Debug
 | 
			
		||||
            # Skip running unit tests on debug builds, because they
 | 
			
		||||
            # take an unreasonable amount of time
 | 
			
		||||
            tests: false
 | 
			
		||||
            runtime: d
 | 
			
		||||
    runs-on: ${{ matrix.version.runs-on }}
 | 
			
		||||
    env:
 | 
			
		||||
      build_dir: .build
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: checkout
 | 
			
		||||
        uses: actions/checkout@v3
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
      - name: choose Python
 | 
			
		||||
        uses: actions/setup-python@v3
 | 
			
		||||
        uses: actions/setup-python@v5
 | 
			
		||||
        with:
 | 
			
		||||
          python-version: 3.9
 | 
			
		||||
      - name: learn Python cache directory
 | 
			
		||||
@@ -39,7 +54,7 @@ jobs:
 | 
			
		||||
          python -m pip install --upgrade pip
 | 
			
		||||
          echo "dir=$(pip cache dir)" | tee ${GITHUB_OUTPUT}
 | 
			
		||||
      - name: restore Python cache directory
 | 
			
		||||
        uses: actions/cache@v3
 | 
			
		||||
        uses: actions/cache@v4
 | 
			
		||||
        with:
 | 
			
		||||
            path: ${{ steps.pip-cache.outputs.dir }}
 | 
			
		||||
            key: ${{ runner.os }}-${{ hashFiles('.github/workflows/windows.yml') }}
 | 
			
		||||
@@ -47,51 +62,39 @@ jobs:
 | 
			
		||||
        run: pip install wheel 'conan<2'
 | 
			
		||||
      - name: check environment
 | 
			
		||||
        run: |
 | 
			
		||||
          dir env:
 | 
			
		||||
          $env:PATH -split ';'
 | 
			
		||||
          python --version
 | 
			
		||||
          conan --version
 | 
			
		||||
          cmake --version
 | 
			
		||||
          dir env:
 | 
			
		||||
      - name: configure Conan
 | 
			
		||||
        shell: bash
 | 
			
		||||
        env:
 | 
			
		||||
          CONAN_URL: http://18.143.149.228:8081/artifactory/api/conan/conan-non-prod
 | 
			
		||||
        run: |
 | 
			
		||||
          conan profile new default --detect
 | 
			
		||||
          conan profile update settings.compiler.runtime=MT${{ matrix.configuration == 'Debug' && 'd' || '' }} default
 | 
			
		||||
          # Do not quote the URL. An empty string will be accepted (with
 | 
			
		||||
          # a non-fatal warning), but a missing argument will not.
 | 
			
		||||
          conan remote add ripple ${{ env.CONAN_URL }} --insert 0
 | 
			
		||||
      - name: try to authenticate to ripple Conan remote
 | 
			
		||||
        shell: bash
 | 
			
		||||
        id: remote
 | 
			
		||||
        run: |
 | 
			
		||||
          echo outcome=$(conan user --remote ripple ${{ secrets.CONAN_USERNAME }} \
 | 
			
		||||
            --password ${{ secrets.CONAN_TOKEN }} >&2 && echo success || \
 | 
			
		||||
            echo failure) | tee ${GITHUB_OUTPUT}
 | 
			
		||||
      - name: list missing binaries
 | 
			
		||||
        id: binaries
 | 
			
		||||
        shell: bash
 | 
			
		||||
        # Print the list of dependencies that would need to be built locally.
 | 
			
		||||
        # A non-empty list means we have "failed" to cache binaries remotely.
 | 
			
		||||
        run: |
 | 
			
		||||
          echo missing=$(conan info . --build missing --settings build_type=${{ matrix.configuration }} --json 2>/dev/null  | grep '^\[') | tee ${GITHUB_OUTPUT}
 | 
			
		||||
          conan profile update settings.compiler.cppstd=20 default
 | 
			
		||||
          conan profile update \
 | 
			
		||||
            settings.compiler.runtime=MT${{ matrix.configuration.runtime }} \
 | 
			
		||||
            default
 | 
			
		||||
      - name: build dependencies
 | 
			
		||||
        uses: ./.github/actions/dependencies
 | 
			
		||||
        env:
 | 
			
		||||
          CONAN_URL: http://18.143.149.228:8081/artifactory/api/conan/conan-non-prod
 | 
			
		||||
          CONAN_LOGIN_USERNAME_RIPPLE: ${{ secrets.CONAN_USERNAME }}
 | 
			
		||||
          CONAN_PASSWORD_RIPPLE: ${{ secrets.CONAN_TOKEN }}
 | 
			
		||||
        with:
 | 
			
		||||
          configuration: ${{ matrix.configuration }}
 | 
			
		||||
      - name: upload dependencies to remote
 | 
			
		||||
        if: (steps.binaries.outputs.missing != '[]') && (steps.remote.outputs.outcome == 'success')
 | 
			
		||||
        run: conan upload --remote ripple '*' --all --parallel --confirm
 | 
			
		||||
          configuration: ${{ matrix.configuration.type }}
 | 
			
		||||
      - name: build
 | 
			
		||||
        uses: ./.github/actions/build
 | 
			
		||||
        with:
 | 
			
		||||
          generator: '${{ matrix.generator }}'
 | 
			
		||||
          configuration: ${{ matrix.configuration }}
 | 
			
		||||
          generator: '${{ matrix.version.generator }}'
 | 
			
		||||
          configuration: ${{ matrix.configuration.type }}
 | 
			
		||||
          # Hard code for now. Move to the matrix if varied options are needed
 | 
			
		||||
          cmake-args: '-Dassert=ON -Dreporting=OFF -Dunity=ON'
 | 
			
		||||
          cmake-args: '-Dassert=TRUE -Dwerr=TRUE -Dreporting=OFF -Dunity=ON'
 | 
			
		||||
          cmake-target: install
 | 
			
		||||
      - name: test
 | 
			
		||||
        shell: bash
 | 
			
		||||
        if: ${{ matrix.configuration.tests }}
 | 
			
		||||
        run: |
 | 
			
		||||
          ${build_dir}/${{ matrix.configuration }}/rippled --unittest --unittest-jobs $(nproc)
 | 
			
		||||
          cd ${build_dir}/${{ matrix.configuration.type }}
 | 
			
		||||
          ./rippled --unittest --unittest-jobs $(nproc)
 | 
			
		||||
          ctest -j $(nproc) --output-on-failure
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
# .pre-commit-config.yaml
 | 
			
		||||
repos:
 | 
			
		||||
- repo: https://github.com/pre-commit/mirrors-clang-format
 | 
			
		||||
  rev: v10.0.1
 | 
			
		||||
  rev: v18.1.3
 | 
			
		||||
  hooks:
 | 
			
		||||
  - id: clang-format
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										193
									
								
								API-CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										193
									
								
								API-CHANGELOG.md
									
									
									
									
									
								
							@@ -8,42 +8,138 @@ The API version controls the API behavior you see. This includes what properties
 | 
			
		||||
 | 
			
		||||
For a log of breaking changes, see the **API Version [number]** headings. In general, breaking changes are associated with a particular API Version number. For non-breaking changes, scroll to the **XRP Ledger version [x.y.z]** headings. Non-breaking changes are associated with a particular XRP Ledger (`rippled`) release.
 | 
			
		||||
 | 
			
		||||
## API Version 2
 | 
			
		||||
 | 
			
		||||
API version 2 is available in `rippled` version 2.0.0 and later. To use this API, clients specify `"api_version" : 2` in each request.
 | 
			
		||||
 | 
			
		||||
#### Removed methods
 | 
			
		||||
 | 
			
		||||
In API version 2, the following deprecated methods are no longer available: (https://github.com/XRPLF/rippled/pull/4759)
 | 
			
		||||
 | 
			
		||||
- `tx_history` - Instead, use other methods such as `account_tx` or `ledger` with the `transactions` field set to `true`.
 | 
			
		||||
- `ledger_header` - Instead, use the `ledger` method.
 | 
			
		||||
 | 
			
		||||
#### Modifications to JSON transaction element in V2
 | 
			
		||||
 | 
			
		||||
In API version 2, JSON elements for transaction output have been changed and made consistent for all methods which output transactions. (https://github.com/XRPLF/rippled/pull/4775)
 | 
			
		||||
This helps to unify the JSON serialization format of transactions. (https://github.com/XRPLF/clio/issues/722, https://github.com/XRPLF/rippled/issues/4727)
 | 
			
		||||
 | 
			
		||||
- JSON transaction element is named `tx_json`
 | 
			
		||||
- Binary transaction element is named `tx_blob`
 | 
			
		||||
- JSON transaction metadata element is named `meta`
 | 
			
		||||
- Binary transaction metadata element is named `meta_blob`
 | 
			
		||||
 | 
			
		||||
Additionally, these elements are now consistently available next to `tx_json` (i.e. sibling elements), where possible:
 | 
			
		||||
 | 
			
		||||
- `hash` - Transaction ID. This data was stored inside transaction output in API version 1, but in API version 2 is a sibling element.
 | 
			
		||||
- `ledger_index` - Ledger index (only set on validated ledgers)
 | 
			
		||||
- `ledger_hash` - Ledger hash (only set on closed or validated ledgers)
 | 
			
		||||
- `close_time_iso` - Ledger close time expressed in ISO 8601 time format (only set on validated ledgers)
 | 
			
		||||
- `validated` - Bool element set to `true` if the transaction is in a validated ledger, otherwise `false`
 | 
			
		||||
 | 
			
		||||
This change affects the following methods:
 | 
			
		||||
 | 
			
		||||
- `tx` - Transaction data moved into element `tx_json` (was inline inside `result`) or, if binary output was requested, moved from `tx` to `tx_blob`. Renamed binary transaction metadata element (if it was requested) from `meta` to `meta_blob`. Changed location of `hash` and added new elements
 | 
			
		||||
- `account_tx` - Renamed transaction element from `tx` to `tx_json`. Renamed binary transaction metadata element (if it was requested) from `meta` to `meta_blob`. Changed location of `hash` and added new elements
 | 
			
		||||
- `transaction_entry` - Renamed transaction metadata element from `metadata` to `meta`. Changed location of `hash` and added new elements
 | 
			
		||||
- `subscribe` - Renamed transaction element from `transaction` to `tx_json`. Changed location of `hash` and added new elements
 | 
			
		||||
- `sign`, `sign_for`, `submit` and `submit_multisigned` - Changed location of `hash` element.
 | 
			
		||||
 | 
			
		||||
#### Modification to `Payment` transaction JSON schema
 | 
			
		||||
 | 
			
		||||
When reading Payments, the `Amount` field should generally **not** be used. Instead, use [delivered_amount](https://xrpl.org/partial-payments.html#the-delivered_amount-field) to see the amount that the Payment delivered. To clarify its meaning, the `Amount` field is being renamed to `DeliverMax`. (https://github.com/XRPLF/rippled/pull/4733)
 | 
			
		||||
 | 
			
		||||
- In `Payment` transaction type, JSON RPC field `Amount` is renamed to `DeliverMax`. To enable smooth client transition, `Amount` is still handled, as described below: (https://github.com/XRPLF/rippled/pull/4733)
 | 
			
		||||
  - On JSON RPC input (e.g. `submit_multisigned` etc. methods), `Amount` is recognized as an alias to `DeliverMax` for both API version 1 and version 2 clients.
 | 
			
		||||
  - On JSON RPC input, submitting both `Amount` and `DeliverMax` fields is allowed _only_ if they are identical; otherwise such input is rejected with `rpcINVALID_PARAMS` error.
 | 
			
		||||
  - On JSON RPC output (e.g. `subscribe`, `account_tx` etc. methods), `DeliverMax` is present in both API version 1 and version 2.
 | 
			
		||||
  - On JSON RPC output, `Amount` is only present in API version 1 and _not_ in version 2.
 | 
			
		||||
 | 
			
		||||
#### Modifications to account_info response
 | 
			
		||||
 | 
			
		||||
- `signer_lists` is returned in the root of the response. (In API version 1, it was nested under `account_data`.) (https://github.com/XRPLF/rippled/pull/3770)
 | 
			
		||||
- When using an invalid `signer_lists` value, the API now returns an "invalidParams" error. (https://github.com/XRPLF/rippled/pull/4585)
 | 
			
		||||
  - (`signer_lists` must be a boolean. In API version 1, strings were accepted and may return a normal response - i.e. as if `signer_lists` were `true`.)
 | 
			
		||||
 | 
			
		||||
#### Modifications to [account_tx](https://xrpl.org/account_tx.html#account_tx) response
 | 
			
		||||
 | 
			
		||||
- Using `ledger_index_min`, `ledger_index_max`, and `ledger_index` returns `invalidParams` because if you use `ledger_index_min` or `ledger_index_max`, then it does not make sense to also specify `ledger_index`. In API version 1, no error was returned. (https://github.com/XRPLF/rippled/pull/4571)
 | 
			
		||||
  - The same applies for `ledger_index_min`, `ledger_index_max`, and `ledger_hash`. (https://github.com/XRPLF/rippled/issues/4545#issuecomment-1565065579)
 | 
			
		||||
- Using a `ledger_index_min` or `ledger_index_max` beyond the range of ledgers that the server has:
 | 
			
		||||
  - returns `lgrIdxMalformed` in API version 2. Previously, in API version 1, no error was returned. (https://github.com/XRPLF/rippled/issues/4288)
 | 
			
		||||
- Attempting to use a non-boolean value (such as a string) for the `binary` or `forward` parameters returns `invalidParams` (`rpcINVALID_PARAMS`). Previously, in API version 1, no error was returned. (https://github.com/XRPLF/rippled/pull/4620)
 | 
			
		||||
 | 
			
		||||
#### Modifications to [noripple_check](https://xrpl.org/noripple_check.html#noripple_check) response
 | 
			
		||||
 | 
			
		||||
- Attempting to use a non-boolean value (such as a string) for the `transactions` parameter returns `invalidParams` (`rpcINVALID_PARAMS`). Previously, in API version 1, no error was returned. (https://github.com/XRPLF/rippled/pull/4620)
 | 
			
		||||
 | 
			
		||||
## API Version 1
 | 
			
		||||
 | 
			
		||||
This version is supported by all `rippled` versions. At time of writing, it is the default API version, used when no `api_version` is specified. When a new API version is introduced, the command line interface will default to the latest API version. The command line is intended for ad-hoc usage by humans, not programs or automated scripts. The command line is not meant for use in production code.
 | 
			
		||||
This version is supported by all `rippled` versions. For WebSocket and HTTP JSON-RPC requests, it is currently the default API version used when no `api_version` is specified.
 | 
			
		||||
 | 
			
		||||
### Idiosyncrasies
 | 
			
		||||
The [commandline](https://xrpl.org/docs/references/http-websocket-apis/api-conventions/request-formatting/#commandline-format) always uses the latest API version. The command line is intended for ad-hoc usage by humans, not programs or automated scripts. The command line is not meant for use in production code.
 | 
			
		||||
 | 
			
		||||
#### V1 account_info response
 | 
			
		||||
### Inconsistency: server_info - network_id
 | 
			
		||||
 | 
			
		||||
In [the response to the `account_info` command](https://xrpl.org/account_info.html#response-format), there is `account_data` - which is supposed to be an `AccountRoot` object - and `signer_lists` is returned in this object. However, the docs say that `signer_lists` should be at the root level of the reponse.
 | 
			
		||||
The `network_id` field was added in the `server_info` response in version 1.5.0 (2019), but it is not returned in [reporting mode](https://xrpl.org/rippled-server-modes.html#reporting-mode). However, use of reporting mode is now discouraged, in favor of using [Clio](https://github.com/XRPLF/clio) instead.
 | 
			
		||||
 | 
			
		||||
It makes sense for `signer_lists` to be at the root level because signer lists are not part of the AccountRoot object. (First reported in [xrpl-dev-portal#938](https://github.com/XRPLF/xrpl-dev-portal/issues/938).)
 | 
			
		||||
## XRP Ledger server version 2.5.0
 | 
			
		||||
 | 
			
		||||
In `api_version: 2`, the `signer_lists` field [will be moved](#modifications-to-account_info-response-in-v2) to the root level of the account_info response. (https://github.com/XRPLF/rippled/pull/3770)
 | 
			
		||||
As of 2025-04-04, version 2.5.0 is in development. You can use a pre-release version by building from source or [using the `nightly` package](https://xrpl.org/docs/infrastructure/installation/install-rippled-on-ubuntu).
 | 
			
		||||
 | 
			
		||||
#### server_info - network_id
 | 
			
		||||
### Additions and bugfixes in 2.5.0
 | 
			
		||||
 | 
			
		||||
The `network_id` field was added in the `server_info` response in version 1.5.0 (2019), but it is not returned in [reporting mode](https://xrpl.org/rippled-server-modes.html#reporting-mode).
 | 
			
		||||
- `channel_authorize`: If `signing_support` is not enabled in the config, the RPC is disabled.
 | 
			
		||||
 | 
			
		||||
## XRP Ledger server version 2.4.0
 | 
			
		||||
 | 
			
		||||
[Version 2.4.0](https://github.com/XRPLF/rippled/releases/tag/2.4.0) was released on March 4, 2025.
 | 
			
		||||
 | 
			
		||||
### Additions and bugfixes in 2.4.0
 | 
			
		||||
 | 
			
		||||
- `ledger_entry`: `state` is added an alias for `ripple_state`.
 | 
			
		||||
- `ledger_entry`: Enables case-insensitive filtering by canonical name in addition to case-sensitive filtering by RPC name.
 | 
			
		||||
- `validators`: Added new field `validator_list_threshold` in response.
 | 
			
		||||
- `simulate`: A new RPC that executes a [dry run of a transaction submission](https://github.com/XRPLF/XRPL-Standards/tree/master/XLS-0069d-simulate#2-rpc-simulate)
 | 
			
		||||
- Signing methods autofill fees better and properly handle transactions that don't have a base fee, and will also autofill the `NetworkID` field.
 | 
			
		||||
 | 
			
		||||
## XRP Ledger server version 2.3.0
 | 
			
		||||
 | 
			
		||||
[Version 2.3.0](https://github.com/XRPLF/rippled/releases/tag/2.3.0) was released on Nov 25, 2024.
 | 
			
		||||
 | 
			
		||||
### Breaking changes in 2.3.0
 | 
			
		||||
 | 
			
		||||
- `book_changes`: If the requested ledger version is not available on this node, a `ledgerNotFound` error is returned and the node does not attempt to acquire the ledger from the p2p network (as with other non-admin RPCs).
 | 
			
		||||
 | 
			
		||||
Admins can still attempt to retrieve old ledgers with the `ledger_request` RPC.
 | 
			
		||||
 | 
			
		||||
### Additions and bugfixes in 2.3.0
 | 
			
		||||
 | 
			
		||||
- `book_changes`: Returns a `validated` field in its response, which was missing in prior versions.
 | 
			
		||||
 | 
			
		||||
## XRP Ledger server version 2.2.0
 | 
			
		||||
 | 
			
		||||
[Version 2.2.0](https://github.com/XRPLF/rippled/releases/tag/2.2.0) was released on Jun 5, 2024. The following additions are non-breaking (because they are purely additive):
 | 
			
		||||
 | 
			
		||||
- The `feature` method now has a non-admin mode for users. (It was previously only available to admin connections.) The method returns an updated list of amendments, including their names and other information. ([#4781](https://github.com/XRPLF/rippled/pull/4781))
 | 
			
		||||
 | 
			
		||||
## XRP Ledger server version 2.0.0
 | 
			
		||||
 | 
			
		||||
### Additions in 2.0
 | 
			
		||||
 | 
			
		||||
Additions are intended to be non-breaking (because they are purely additive).
 | 
			
		||||
[Version 2.0.0](https://github.com/XRPLF/rippled/releases/tag/2.0.0) was released on Jan 9, 2024. The following additions are non-breaking (because they are purely additive):
 | 
			
		||||
 | 
			
		||||
- `server_definitions`: A new RPC that generates a `definitions.json`-like output that can be used in XRPL libraries.
 | 
			
		||||
- In `Payment` transactions, `DeliverMax` has been added. This is a replacement for the `Amount` field, which should not be used. Typically, the `delivered_amount` (in transaction metadata) should be used. To ease the transition, `DeliverMax` is present regardless of API version, since adding a field is non-breaking.
 | 
			
		||||
- API version 2 has been moved from beta to supported, meaning that it is generally available (regardless of the `beta_rpc_api` setting).
 | 
			
		||||
 | 
			
		||||
## XRP Ledger server version 2.2.0
 | 
			
		||||
 | 
			
		||||
The following is a non-breaking addition to the API.
 | 
			
		||||
 | 
			
		||||
- The `feature` method now has a non-admin mode for users. (It was previously only available to admin connections.) The method returns an updated list of amendments, including their names and other information. ([#4781](https://github.com/XRPLF/rippled/pull/4781))
 | 
			
		||||
 | 
			
		||||
## XRP Ledger server version 1.12.0
 | 
			
		||||
 | 
			
		||||
[Version 1.12.0](https://github.com/XRPLF/rippled/releases/tag/1.12.0) was released on Sep 6, 2023.
 | 
			
		||||
 | 
			
		||||
### Additions in 1.12
 | 
			
		||||
 | 
			
		||||
Additions are intended to be non-breaking (because they are purely additive).
 | 
			
		||||
[Version 1.12.0](https://github.com/XRPLF/rippled/releases/tag/1.12.0) was released on Sep 6, 2023. The following additions are non-breaking (because they are purely additive).
 | 
			
		||||
 | 
			
		||||
- `server_info`: Added `ports`, an array which advertises the RPC and WebSocket ports. This information is also included in the `/crawl` endpoint (which calls `server_info` internally). `grpc` and `peer` ports are also included. (https://github.com/XRPLF/rippled/pull/4427)
 | 
			
		||||
  - `ports` contains objects, each containing a `port` for the listening port (a number string), and a `protocol` array listing the supported protocols on that port.
 | 
			
		||||
@@ -120,71 +216,6 @@ was released on Mar 14, 2023.
 | 
			
		||||
  removed from the [ledger subscription stream](https://xrpl.org/subscribe.html#ledger-stream), because it will no longer
 | 
			
		||||
  have any meaning.
 | 
			
		||||
 | 
			
		||||
## API Version 2
 | 
			
		||||
 | 
			
		||||
API version 2 is introduced in `rippled` version 2.0. Users can request it explicitly by specifying `"api_version" : 2`.
 | 
			
		||||
 | 
			
		||||
#### Removed methods
 | 
			
		||||
 | 
			
		||||
In API version 2, the following deprecated methods are no longer available: (https://github.com/XRPLF/rippled/pull/4759)
 | 
			
		||||
 | 
			
		||||
- `tx_history` - Instead, use other methods such as `account_tx` or `ledger` with the `transactions` field set to `true`.
 | 
			
		||||
- `ledger_header` - Instead, use the `ledger` method.
 | 
			
		||||
 | 
			
		||||
#### Modifications to JSON transaction element in V2
 | 
			
		||||
 | 
			
		||||
In API version 2, JSON elements for transaction output have been changed and made consistent for all methods which output transactions. (https://github.com/XRPLF/rippled/pull/4775)
 | 
			
		||||
This helps to unify the JSON serialization format of transactions. (https://github.com/XRPLF/clio/issues/722, https://github.com/XRPLF/rippled/issues/4727)
 | 
			
		||||
 | 
			
		||||
- JSON transaction element is named `tx_json`
 | 
			
		||||
- Binary transaction element is named `tx_blob`
 | 
			
		||||
- JSON transaction metadata element is named `meta`
 | 
			
		||||
- Binary transaction metadata element is named `meta_blob`
 | 
			
		||||
 | 
			
		||||
Additionally, these elements are now consistently available next to `tx_json` (i.e. sibling elements), where possible:
 | 
			
		||||
 | 
			
		||||
- `hash` - Transaction ID. This data was stored inside transaction output in API version 1, but in API version 2 is a sibling element.
 | 
			
		||||
- `ledger_index` - Ledger index (only set on validated ledgers)
 | 
			
		||||
- `ledger_hash` - Ledger hash (only set on closed or validated ledgers)
 | 
			
		||||
- `close_time_iso` - Ledger close time expressed in ISO 8601 time format (only set on validated ledgers)
 | 
			
		||||
- `validated` - Bool element set to `true` if the transaction is in a validated ledger, otherwise `false`
 | 
			
		||||
 | 
			
		||||
This change affects the following methods:
 | 
			
		||||
 | 
			
		||||
- `tx` - Transaction data moved into element `tx_json` (was inline inside `result`) or, if binary output was requested, moved from `tx` to `tx_blob`. Renamed binary transaction metadata element (if it was requested) from `meta` to `meta_blob`. Changed location of `hash` and added new elements
 | 
			
		||||
- `account_tx` - Renamed transaction element from `tx` to `tx_json`. Renamed binary transaction metadata element (if it was requested) from `meta` to `meta_blob`. Changed location of `hash` and added new elements
 | 
			
		||||
- `transaction_entry` - Renamed transaction metadata element from `metadata` to `meta`. Changed location of `hash` and added new elements
 | 
			
		||||
- `subscribe` - Renamed transaction element from `transaction` to `tx_json`. Changed location of `hash` and added new elements
 | 
			
		||||
- `sign`, `sign_for`, `submit` and `submit_multisigned` - Changed location of `hash` element.
 | 
			
		||||
 | 
			
		||||
#### Modification to `Payment` transaction JSON schema
 | 
			
		||||
 | 
			
		||||
When reading Payments, the `Amount` field should generally **not** be used. Instead, use [delivered_amount](https://xrpl.org/partial-payments.html#the-delivered_amount-field) to see the amount that the Payment delivered. To clarify its meaning, the `Amount` field is being renamed to `DeliverMax`. (https://github.com/XRPLF/rippled/pull/4733)
 | 
			
		||||
 | 
			
		||||
- In `Payment` transaction type, JSON RPC field `Amount` is renamed to `DeliverMax`. To enable smooth client transition, `Amount` is still handled, as described below: (https://github.com/XRPLF/rippled/pull/4733)
 | 
			
		||||
  - On JSON RPC input (e.g. `submit_multisigned` etc. methods), `Amount` is recognized as an alias to `DeliverMax` for both API version 1 and version 2 clients.
 | 
			
		||||
  - On JSON RPC input, submitting both `Amount` and `DeliverMax` fields is allowed _only_ if they are identical; otherwise such input is rejected with `rpcINVALID_PARAMS` error.
 | 
			
		||||
  - On JSON RPC output (e.g. `subscribe`, `account_tx` etc. methods), `DeliverMax` is present in both API version 1 and version 2.
 | 
			
		||||
  - On JSON RPC output, `Amount` is only present in API version 1 and _not_ in version 2.
 | 
			
		||||
 | 
			
		||||
#### Modifications to account_info response
 | 
			
		||||
 | 
			
		||||
- `signer_lists` is returned in the root of the response. In API version 1, it was nested under `account_data`. (https://github.com/XRPLF/rippled/pull/3770)
 | 
			
		||||
- When using an invalid `signer_lists` value, the API now returns an "invalidParams" error. (https://github.com/XRPLF/rippled/pull/4585)
 | 
			
		||||
  - (`signer_lists` must be a boolean. In API version 1, strings were accepted and may return a normal response - i.e. as if `signer_lists` were `true`.)
 | 
			
		||||
 | 
			
		||||
#### Modifications to [account_tx](https://xrpl.org/account_tx.html#account_tx) response
 | 
			
		||||
 | 
			
		||||
- Using `ledger_index_min`, `ledger_index_max`, and `ledger_index` returns `invalidParams` because if you use `ledger_index_min` or `ledger_index_max`, then it does not make sense to also specify `ledger_index`. In API version 1, no error was returned. (https://github.com/XRPLF/rippled/pull/4571)
 | 
			
		||||
  - The same applies for `ledger_index_min`, `ledger_index_max`, and `ledger_hash`. (https://github.com/XRPLF/rippled/issues/4545#issuecomment-1565065579)
 | 
			
		||||
- Using a `ledger_index_min` or `ledger_index_max` beyond the range of ledgers that the server has:
 | 
			
		||||
  - returns `lgrIdxMalformed` in API version 2. Previously, in API version 1, no error was returned. (https://github.com/XRPLF/rippled/issues/4288)
 | 
			
		||||
- Attempting to use a non-boolean value (such as a string) for the `binary` or `forward` parameters returns `invalidParams` (`rpcINVALID_PARAMS`). Previously, in API version 1, no error was returned. (https://github.com/XRPLF/rippled/pull/4620)
 | 
			
		||||
 | 
			
		||||
#### Modifications to [noripple_check](https://xrpl.org/noripple_check.html#noripple_check) response
 | 
			
		||||
 | 
			
		||||
- Attempting to use a non-boolean value (such as a string) for the `transactions` parameter returns `invalidParams` (`rpcINVALID_PARAMS`). Previously, in API version 1, no error was returned. (https://github.com/XRPLF/rippled/pull/4620)
 | 
			
		||||
 | 
			
		||||
# Unit tests for API changes
 | 
			
		||||
 | 
			
		||||
The following information is useful to developers contributing to this project:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										112
									
								
								BUILD.md
									
									
									
									
									
								
							
							
						
						
									
										112
									
								
								BUILD.md
									
									
									
									
									
								
							@@ -36,9 +36,15 @@ See [System Requirements](https://xrpl.org/system-requirements.html).
 | 
			
		||||
Building rippled generally requires git, Python, Conan, CMake, and a C++ compiler. Some guidance on setting up such a [C++ development environment can be found here](./docs/build/environment.md).
 | 
			
		||||
 | 
			
		||||
- [Python 3.7](https://www.python.org/downloads/)
 | 
			
		||||
- [Conan 1.55](https://conan.io/downloads.html)
 | 
			
		||||
- [Conan 1.60](https://conan.io/downloads.html)[^1]
 | 
			
		||||
- [CMake 3.16](https://cmake.org/download/)
 | 
			
		||||
 | 
			
		||||
[^1]: It is possible to build with Conan 2.x,
 | 
			
		||||
but the instructions are significantly different,
 | 
			
		||||
which is why we are not recommending it yet.
 | 
			
		||||
Notably, the `conan profile update` command is removed in 2.x.
 | 
			
		||||
Profiles must be edited by hand.
 | 
			
		||||
 | 
			
		||||
`rippled` is written in the C++20 dialect and includes the `<concepts>` header.
 | 
			
		||||
The [minimum compiler versions][2] required are:
 | 
			
		||||
 | 
			
		||||
@@ -67,9 +73,6 @@ Here are [sample instructions for setting up a C++ development environment on ma
 | 
			
		||||
Windows is not recommended for production use at this time.
 | 
			
		||||
 | 
			
		||||
- Additionally, 32-bit Windows development is not supported.
 | 
			
		||||
- Visual Studio 2022 is not yet supported.
 | 
			
		||||
  - rippled generally requires [Boost][] 1.77, which Conan cannot build with VS 2022.
 | 
			
		||||
  - Until rippled is updated for compatibility with later versions of Boost, Windows developers may need to use Visual Studio 2019.
 | 
			
		||||
 | 
			
		||||
[Boost]: https://www.boost.org/
 | 
			
		||||
 | 
			
		||||
@@ -95,6 +98,12 @@ Update the compiler settings:
 | 
			
		||||
   conan profile update settings.compiler.cppstd=20 default
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
Configure Conan (1.x only) to use recipe revisions:
 | 
			
		||||
 | 
			
		||||
   ```
 | 
			
		||||
   conan config set general.revisions_enabled=1
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
**Linux** developers will commonly have a default Conan [profile][] that compiles
 | 
			
		||||
with GCC and links with libstdc++.
 | 
			
		||||
If you are linking with libstdc++ (see profile setting `compiler.libcxx`),
 | 
			
		||||
@@ -104,6 +113,20 @@ then you will need to choose the `libstdc++11` ABI:
 | 
			
		||||
   conan profile update settings.compiler.libcxx=libstdc++11 default
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Ensure inter-operability between `boost::string_view` and `std::string_view` types:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
conan profile update 'conf.tools.build:cxxflags+=["-DBOOST_BEAST_USE_STD_STRING_VIEW"]' default
 | 
			
		||||
conan profile update 'env.CXXFLAGS="-DBOOST_BEAST_USE_STD_STRING_VIEW"' default
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
If you have other flags in the `conf.tools.build` or `env.CXXFLAGS` sections, make sure to retain the existing flags and append the new ones. You can check them with:
 | 
			
		||||
```
 | 
			
		||||
conan profile show default
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
**Windows** developers may need to use the x64 native build tools.
 | 
			
		||||
An easy way to do that is to run the shortcut "x64 Native Tools Command
 | 
			
		||||
Prompt" for the version of Visual Studio that you have installed.
 | 
			
		||||
@@ -144,14 +167,41 @@ It does not explicitly link the C++ standard library,
 | 
			
		||||
which allows you to statically link it with GCC, if you want.
 | 
			
		||||
 | 
			
		||||
   ```
 | 
			
		||||
   # Conan 1.x
 | 
			
		||||
   conan export external/snappy snappy/1.1.10@
 | 
			
		||||
   # Conan 2.x
 | 
			
		||||
   conan export --version 1.1.10 external/snappy
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
Export our [Conan recipe for RocksDB](./external/rocksdb).
 | 
			
		||||
It does not override paths to dependencies when building with Visual Studio.
 | 
			
		||||
 | 
			
		||||
   ```
 | 
			
		||||
   # Conan 1.x
 | 
			
		||||
   conan export external/rocksdb rocksdb/9.7.3@
 | 
			
		||||
   # Conan 2.x
 | 
			
		||||
   conan export --version 9.7.3 external/rocksdb
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
Export our [Conan recipe for SOCI](./external/soci).
 | 
			
		||||
It patches their CMake to correctly import its dependencies.
 | 
			
		||||
 | 
			
		||||
   ```
 | 
			
		||||
   # Conan 1.x
 | 
			
		||||
   conan export external/soci soci/4.0.3@
 | 
			
		||||
   # Conan 2.x
 | 
			
		||||
   conan export --version 4.0.3 external/soci
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
Export our [Conan recipe for NuDB](./external/nudb).
 | 
			
		||||
It fixes some source files to add missing `#include`s.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   ```
 | 
			
		||||
   # Conan 1.x
 | 
			
		||||
   conan export external/nudb nudb/2.0.8@
 | 
			
		||||
   # Conan 2.x
 | 
			
		||||
   conan export --version 2.0.8 external/nudb
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
### Build and Test
 | 
			
		||||
@@ -172,13 +222,15 @@ It patches their CMake to correctly import its dependencies.
 | 
			
		||||
   the `install-folder` or `-if` option to every `conan install` command
 | 
			
		||||
   in the next step.
 | 
			
		||||
 | 
			
		||||
2. Generate CMake files for every configuration you want to build. 
 | 
			
		||||
2. Use conan to generate CMake files for every configuration you want to build:
 | 
			
		||||
 | 
			
		||||
    ```
 | 
			
		||||
    conan install .. --output-folder . --build missing --settings build_type=Release
 | 
			
		||||
    conan install .. --output-folder . --build missing --settings build_type=Debug
 | 
			
		||||
    ```
 | 
			
		||||
 | 
			
		||||
    To build Debug, in the next step, be sure to set `-DCMAKE_BUILD_TYPE=Debug`
 | 
			
		||||
 | 
			
		||||
    For a single-configuration generator, e.g. `Unix Makefiles` or `Ninja`,
 | 
			
		||||
    you only need to run this command once.
 | 
			
		||||
    For a multi-configuration generator, e.g. `Visual Studio`, you may want to
 | 
			
		||||
@@ -189,13 +241,13 @@ It patches their CMake to correctly import its dependencies.
 | 
			
		||||
    generated by the first. You can pass the build type on the command line with
 | 
			
		||||
    `--settings build_type=$BUILD_TYPE` or in the profile itself,
 | 
			
		||||
    under the section `[settings]` with the key `build_type`.
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    If you are using a Microsoft Visual C++ compiler,
 | 
			
		||||
    then you will need to ensure consistency between the `build_type` setting
 | 
			
		||||
    and the `compiler.runtime` setting.
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    When `build_type` is `Release`, `compiler.runtime` should be `MT`.
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    When `build_type` is `Debug`, `compiler.runtime` should be `MTd`.
 | 
			
		||||
 | 
			
		||||
    ```
 | 
			
		||||
@@ -208,23 +260,26 @@ It patches their CMake to correctly import its dependencies.
 | 
			
		||||
 | 
			
		||||
    Single-config generators:
 | 
			
		||||
 | 
			
		||||
    Pass the CMake variable [`CMAKE_BUILD_TYPE`][build_type]
 | 
			
		||||
    and make sure it matches the one of the `build_type` settings
 | 
			
		||||
    you chose in the previous step.
 | 
			
		||||
 | 
			
		||||
    For example, to build Debug, in the next command, replace "Release" with "Debug"
 | 
			
		||||
 | 
			
		||||
    ```
 | 
			
		||||
    cmake -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release ..
 | 
			
		||||
    cmake -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release -Dxrpld=ON -Dtests=ON ..
 | 
			
		||||
    ```
 | 
			
		||||
 | 
			
		||||
    Pass the CMake variable [`CMAKE_BUILD_TYPE`][build_type]
 | 
			
		||||
    and make sure it matches the `build_type` setting you chose in the previous
 | 
			
		||||
    step.
 | 
			
		||||
 | 
			
		||||
    Multi-config generators:
 | 
			
		||||
 | 
			
		||||
    ```
 | 
			
		||||
    cmake -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake ..
 | 
			
		||||
    cmake -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake -Dxrpld=ON -Dtests=ON  ..
 | 
			
		||||
    ```
 | 
			
		||||
 | 
			
		||||
    **Note:** You can pass build options for `rippled` in this step.
 | 
			
		||||
 | 
			
		||||
4. Build `rippled`.
 | 
			
		||||
5. Build `rippled`.
 | 
			
		||||
 | 
			
		||||
   For a single-configuration generator, it will build whatever configuration
 | 
			
		||||
   you passed for `CMAKE_BUILD_TYPE`. For a multi-configuration generator,
 | 
			
		||||
@@ -233,7 +288,7 @@ It patches their CMake to correctly import its dependencies.
 | 
			
		||||
   Single-config generators:
 | 
			
		||||
 | 
			
		||||
   ```
 | 
			
		||||
   cmake --build .
 | 
			
		||||
   cmake --build . -j $(nproc)
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
   Multi-config generators:
 | 
			
		||||
@@ -243,7 +298,7 @@ It patches their CMake to correctly import its dependencies.
 | 
			
		||||
   cmake --build . --config Debug
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
5. Test rippled.
 | 
			
		||||
6. Test rippled.
 | 
			
		||||
 | 
			
		||||
   Single-config generators:
 | 
			
		||||
 | 
			
		||||
@@ -310,7 +365,7 @@ Example use with some cmake variables set:
 | 
			
		||||
```
 | 
			
		||||
cd .build
 | 
			
		||||
conan install .. --output-folder . --build missing --settings build_type=Debug
 | 
			
		||||
cmake -DCMAKE_BUILD_TYPE=Debug -Dcoverage=ON -Dcoverage_test_parallelism=2 -Dcoverage_format=html-details -Dcoverage_extra_args="--json coverage.json" -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake ..
 | 
			
		||||
cmake -DCMAKE_BUILD_TYPE=Debug -Dcoverage=ON -Dxrpld=ON -Dtests=ON -Dcoverage_test_parallelism=2 -Dcoverage_format=html-details -Dcoverage_extra_args="--json coverage.json" -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake ..
 | 
			
		||||
cmake --build . --target coverage
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
@@ -326,11 +381,11 @@ stored inside the build directory, as either of:
 | 
			
		||||
| Option | Default Value | Description |
 | 
			
		||||
| --- | ---| ---|
 | 
			
		||||
| `assert` | OFF | Enable assertions.
 | 
			
		||||
| `reporting` | OFF | Build the reporting mode feature. |
 | 
			
		||||
| `coverage` | OFF | Prepare the coverage report. |
 | 
			
		||||
| `tests` | ON | Build tests. |
 | 
			
		||||
| `unity` | ON | Configure a unity build. |
 | 
			
		||||
| `san` | N/A | Enable a sanitizer with Clang. Choices are `thread` and `address`. |
 | 
			
		||||
| `tests` | OFF | Build tests. |
 | 
			
		||||
| `unity` | ON | Configure a unity build. |
 | 
			
		||||
| `xrpld` | OFF | Build the xrpld (`rippled`) application, and not just the libxrpl library. |
 | 
			
		||||
 | 
			
		||||
[Unity builds][5] may be faster for the first build
 | 
			
		||||
(at the cost of much more memory) since they concatenate sources into fewer
 | 
			
		||||
@@ -353,6 +408,23 @@ After any updates or changes to dependencies, you may need to do the following:
 | 
			
		||||
4. Re-run [conan install](#build-and-test).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### 'protobuf/port_def.inc' file not found
 | 
			
		||||
 | 
			
		||||
If `cmake --build .` results in an error due to a missing a protobuf file, then you might have generated CMake files for a different `build_type` than the `CMAKE_BUILD_TYPE` you passed to conan.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
/rippled/.build/pb-xrpl.libpb/xrpl/proto/ripple.pb.h:10:10: fatal error: 'google/protobuf/port_def.inc' file not found
 | 
			
		||||
   10 | #include <google/protobuf/port_def.inc>
 | 
			
		||||
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
1 error generated.
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
For example, if you want to build Debug:
 | 
			
		||||
 | 
			
		||||
1. For conan install, pass `--settings build_type=Debug`
 | 
			
		||||
2. For cmake, pass `-DCMAKE_BUILD_TYPE=Debug`
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### no std::result_of
 | 
			
		||||
 | 
			
		||||
If your compiler version is recent enough to have removed `std::result_of` as
 | 
			
		||||
 
 | 
			
		||||
@@ -1,207 +0,0 @@
 | 
			
		||||
 | 
			
		||||
macro(group_sources_in source_dir curdir)
 | 
			
		||||
  file(GLOB children RELATIVE ${source_dir}/${curdir}
 | 
			
		||||
    ${source_dir}/${curdir}/*)
 | 
			
		||||
  foreach (child ${children})
 | 
			
		||||
    if (IS_DIRECTORY ${source_dir}/${curdir}/${child})
 | 
			
		||||
      group_sources_in(${source_dir} ${curdir}/${child})
 | 
			
		||||
    else()
 | 
			
		||||
      string(REPLACE "/" "\\" groupname ${curdir})
 | 
			
		||||
      source_group(${groupname} FILES
 | 
			
		||||
        ${source_dir}/${curdir}/${child})
 | 
			
		||||
    endif()
 | 
			
		||||
  endforeach()
 | 
			
		||||
endmacro()
 | 
			
		||||
 | 
			
		||||
macro(group_sources curdir)
 | 
			
		||||
  group_sources_in(${PROJECT_SOURCE_DIR} ${curdir})
 | 
			
		||||
endmacro()
 | 
			
		||||
 | 
			
		||||
macro (exclude_from_default target_)
 | 
			
		||||
  set_target_properties (${target_} PROPERTIES EXCLUDE_FROM_ALL ON)
 | 
			
		||||
  set_target_properties (${target_} PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD ON)
 | 
			
		||||
endmacro ()
 | 
			
		||||
 | 
			
		||||
macro (exclude_if_included target_)
 | 
			
		||||
  get_directory_property(has_parent PARENT_DIRECTORY)
 | 
			
		||||
  if (has_parent)
 | 
			
		||||
    exclude_from_default (${target_})
 | 
			
		||||
  endif ()
 | 
			
		||||
endmacro ()
 | 
			
		||||
 | 
			
		||||
function (print_ep_logs _target)
 | 
			
		||||
  ExternalProject_Get_Property (${_target} STAMP_DIR)
 | 
			
		||||
  add_custom_command(TARGET ${_target} POST_BUILD
 | 
			
		||||
    COMMENT "${_target} BUILD OUTPUT"
 | 
			
		||||
    COMMAND ${CMAKE_COMMAND}
 | 
			
		||||
      -DIN_FILE=${STAMP_DIR}/${_target}-build-out.log
 | 
			
		||||
      -P ${CMAKE_CURRENT_SOURCE_DIR}/Builds/CMake/echo_file.cmake
 | 
			
		||||
    COMMAND ${CMAKE_COMMAND}
 | 
			
		||||
      -DIN_FILE=${STAMP_DIR}/${_target}-build-err.log
 | 
			
		||||
      -P ${CMAKE_CURRENT_SOURCE_DIR}/Builds/CMake/echo_file.cmake)
 | 
			
		||||
endfunction ()
 | 
			
		||||
 | 
			
		||||
#[=========================================================[
 | 
			
		||||
  This is a function override for one function in the
 | 
			
		||||
  standard ExternalProject module. We want to change
 | 
			
		||||
  the generated build script slightly to include printing
 | 
			
		||||
  the build logs in the case of failure. Those modifications
 | 
			
		||||
  have been made here. This function override could break
 | 
			
		||||
  in the future if the ExternalProject module changes internal
 | 
			
		||||
  function names or changes the way it generates the build
 | 
			
		||||
  scripts.
 | 
			
		||||
   See:
 | 
			
		||||
    https://gitlab.kitware.com/cmake/cmake/blob/df1ddeec128d68cc636f2dde6c2acd87af5658b6/Modules/ExternalProject.cmake#L1855-1952
 | 
			
		||||
#]=========================================================]
 | 
			
		||||
 | 
			
		||||
function(_ep_write_log_script name step cmd_var)
 | 
			
		||||
  ExternalProject_Get_Property(${name} stamp_dir)
 | 
			
		||||
  set(command "${${cmd_var}}")
 | 
			
		||||
 | 
			
		||||
  set(make "")
 | 
			
		||||
  set(code_cygpath_make "")
 | 
			
		||||
  if(command MATCHES "^\\$\\(MAKE\\)")
 | 
			
		||||
    # GNU make recognizes the string "$(MAKE)" as recursive make, so
 | 
			
		||||
    # ensure that it appears directly in the makefile.
 | 
			
		||||
    string(REGEX REPLACE "^\\$\\(MAKE\\)" "\${make}" command "${command}")
 | 
			
		||||
    set(make "-Dmake=$(MAKE)")
 | 
			
		||||
 | 
			
		||||
    if(WIN32 AND NOT CYGWIN)
 | 
			
		||||
      set(code_cygpath_make "
 | 
			
		||||
if(\${make} MATCHES \"^/\")
 | 
			
		||||
  execute_process(
 | 
			
		||||
    COMMAND cygpath -w \${make}
 | 
			
		||||
    OUTPUT_VARIABLE cygpath_make
 | 
			
		||||
    ERROR_VARIABLE cygpath_make
 | 
			
		||||
    RESULT_VARIABLE cygpath_error
 | 
			
		||||
    OUTPUT_STRIP_TRAILING_WHITESPACE
 | 
			
		||||
  )
 | 
			
		||||
  if(NOT cygpath_error)
 | 
			
		||||
    set(make \${cygpath_make})
 | 
			
		||||
  endif()
 | 
			
		||||
endif()
 | 
			
		||||
")
 | 
			
		||||
    endif()
 | 
			
		||||
  endif()
 | 
			
		||||
 | 
			
		||||
  set(config "")
 | 
			
		||||
  if("${CMAKE_CFG_INTDIR}" MATCHES "^\\$")
 | 
			
		||||
    string(REPLACE "${CMAKE_CFG_INTDIR}" "\${config}" command "${command}")
 | 
			
		||||
    set(config "-Dconfig=${CMAKE_CFG_INTDIR}")
 | 
			
		||||
  endif()
 | 
			
		||||
 | 
			
		||||
  # Wrap multiple 'COMMAND' lines up into a second-level wrapper
 | 
			
		||||
  # script so all output can be sent to one log file.
 | 
			
		||||
  if(command MATCHES "(^|;)COMMAND;")
 | 
			
		||||
    set(code_execute_process "
 | 
			
		||||
${code_cygpath_make}
 | 
			
		||||
execute_process(COMMAND \${command} RESULT_VARIABLE result)
 | 
			
		||||
if(result)
 | 
			
		||||
  set(msg \"Command failed (\${result}):\\n\")
 | 
			
		||||
  foreach(arg IN LISTS command)
 | 
			
		||||
    set(msg \"\${msg} '\${arg}'\")
 | 
			
		||||
  endforeach()
 | 
			
		||||
  message(FATAL_ERROR \"\${msg}\")
 | 
			
		||||
endif()
 | 
			
		||||
")
 | 
			
		||||
    set(code "")
 | 
			
		||||
    set(cmd "")
 | 
			
		||||
    set(sep "")
 | 
			
		||||
    foreach(arg IN LISTS command)
 | 
			
		||||
      if("x${arg}" STREQUAL "xCOMMAND")
 | 
			
		||||
        if(NOT "x${cmd}" STREQUAL "x")
 | 
			
		||||
          string(APPEND code "set(command \"${cmd}\")${code_execute_process}")
 | 
			
		||||
        endif()
 | 
			
		||||
        set(cmd "")
 | 
			
		||||
        set(sep "")
 | 
			
		||||
      else()
 | 
			
		||||
        string(APPEND cmd "${sep}${arg}")
 | 
			
		||||
        set(sep ";")
 | 
			
		||||
      endif()
 | 
			
		||||
    endforeach()
 | 
			
		||||
    string(APPEND code "set(command \"${cmd}\")${code_execute_process}")
 | 
			
		||||
    file(GENERATE OUTPUT "${stamp_dir}/${name}-${step}-$<CONFIG>-impl.cmake" CONTENT "${code}")
 | 
			
		||||
    set(command ${CMAKE_COMMAND} "-Dmake=\${make}" "-Dconfig=\${config}" -P ${stamp_dir}/${name}-${step}-$<CONFIG>-impl.cmake)
 | 
			
		||||
  endif()
 | 
			
		||||
 | 
			
		||||
  # Wrap the command in a script to log output to files.
 | 
			
		||||
  set(script ${stamp_dir}/${name}-${step}-$<CONFIG>.cmake)
 | 
			
		||||
  set(logbase ${stamp_dir}/${name}-${step})
 | 
			
		||||
  set(code "
 | 
			
		||||
${code_cygpath_make}
 | 
			
		||||
function (_echo_file _fil)
 | 
			
		||||
  file (READ \${_fil} _cont)
 | 
			
		||||
  execute_process (COMMAND \${CMAKE_COMMAND} -E echo \"\${_cont}\")
 | 
			
		||||
endfunction ()
 | 
			
		||||
set(command \"${command}\")
 | 
			
		||||
execute_process(
 | 
			
		||||
  COMMAND \${command}
 | 
			
		||||
  RESULT_VARIABLE result
 | 
			
		||||
  OUTPUT_FILE \"${logbase}-out.log\"
 | 
			
		||||
  ERROR_FILE \"${logbase}-err.log\"
 | 
			
		||||
  )
 | 
			
		||||
if(result)
 | 
			
		||||
  set(msg \"Command failed: \${result}\\n\")
 | 
			
		||||
  foreach(arg IN LISTS command)
 | 
			
		||||
    set(msg \"\${msg} '\${arg}'\")
 | 
			
		||||
  endforeach()
 | 
			
		||||
  execute_process (COMMAND \${CMAKE_COMMAND} -E echo \"Build output for ${logbase} : \")
 | 
			
		||||
  _echo_file (\"${logbase}-out.log\")
 | 
			
		||||
  _echo_file (\"${logbase}-err.log\")
 | 
			
		||||
  set(msg \"\${msg}\\nSee above\\n\")
 | 
			
		||||
  message(FATAL_ERROR \"\${msg}\")
 | 
			
		||||
else()
 | 
			
		||||
  set(msg \"${name} ${step} command succeeded.  See also ${logbase}-*.log\")
 | 
			
		||||
  message(STATUS \"\${msg}\")
 | 
			
		||||
endif()
 | 
			
		||||
")
 | 
			
		||||
  file(GENERATE OUTPUT "${script}" CONTENT "${code}")
 | 
			
		||||
  set(command ${CMAKE_COMMAND} ${make} ${config} -P ${script})
 | 
			
		||||
  set(${cmd_var} "${command}" PARENT_SCOPE)
 | 
			
		||||
endfunction()
 | 
			
		||||
 | 
			
		||||
find_package(Git)
 | 
			
		||||
 | 
			
		||||
# function that calls git log to get current hash
 | 
			
		||||
function (git_hash hash_val)
 | 
			
		||||
  # note: optional second extra string argument not in signature
 | 
			
		||||
  if (NOT GIT_FOUND)
 | 
			
		||||
    return ()
 | 
			
		||||
  endif ()
 | 
			
		||||
  set (_hash "")
 | 
			
		||||
  set (_format "%H")
 | 
			
		||||
  if (ARGC GREATER_EQUAL 2)
 | 
			
		||||
    string (TOLOWER ${ARGV1} _short)
 | 
			
		||||
    if (_short STREQUAL "short")
 | 
			
		||||
      set (_format "%h")
 | 
			
		||||
    endif ()
 | 
			
		||||
  endif ()
 | 
			
		||||
  execute_process (COMMAND ${GIT_EXECUTABLE} "log" "--pretty=${_format}" "-n1"
 | 
			
		||||
                   WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
 | 
			
		||||
                   RESULT_VARIABLE _git_exit_code
 | 
			
		||||
                   OUTPUT_VARIABLE _temp_hash
 | 
			
		||||
                   OUTPUT_STRIP_TRAILING_WHITESPACE
 | 
			
		||||
                   ERROR_QUIET)
 | 
			
		||||
  if (_git_exit_code EQUAL 0)
 | 
			
		||||
    set (_hash ${_temp_hash})
 | 
			
		||||
  endif ()
 | 
			
		||||
  set (${hash_val} "${_hash}" PARENT_SCOPE)
 | 
			
		||||
endfunction ()
 | 
			
		||||
 | 
			
		||||
function (git_branch branch_val)
 | 
			
		||||
  if (NOT GIT_FOUND)
 | 
			
		||||
    return ()
 | 
			
		||||
  endif ()
 | 
			
		||||
  set (_branch "")
 | 
			
		||||
  execute_process (COMMAND ${GIT_EXECUTABLE} "rev-parse" "--abbrev-ref" "HEAD"
 | 
			
		||||
                   WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
 | 
			
		||||
                   RESULT_VARIABLE _git_exit_code
 | 
			
		||||
                   OUTPUT_VARIABLE _temp_branch
 | 
			
		||||
                   OUTPUT_STRIP_TRAILING_WHITESPACE
 | 
			
		||||
                   ERROR_QUIET)
 | 
			
		||||
  if (_git_exit_code EQUAL 0)
 | 
			
		||||
    set (_branch ${_temp_branch})
 | 
			
		||||
  endif ()
 | 
			
		||||
  set (${branch_val} "${_branch}" PARENT_SCOPE)
 | 
			
		||||
endfunction ()
 | 
			
		||||
 | 
			
		||||
@@ -1,60 +0,0 @@
 | 
			
		||||
 | 
			
		||||
#[=========================================================[
 | 
			
		||||
  SQLITE doesn't provide build files in the
 | 
			
		||||
  standard source-only distribution. So we wrote
 | 
			
		||||
  a simple cmake file and we copy it to the
 | 
			
		||||
  external project folder so that we can use
 | 
			
		||||
  this file to build the lib with ExternalProject
 | 
			
		||||
#]=========================================================]
 | 
			
		||||
 | 
			
		||||
add_library (sqlite3 STATIC sqlite3.c)
 | 
			
		||||
#[=========================================================[
 | 
			
		||||
   When compiled with SQLITE_THREADSAFE=1, SQLite operates
 | 
			
		||||
   in serialized mode. In this mode, SQLite can be safely
 | 
			
		||||
   used by multiple threads with no restriction.
 | 
			
		||||
 | 
			
		||||
   NOTE: This implies a global mutex!
 | 
			
		||||
 | 
			
		||||
   When compiled with SQLITE_THREADSAFE=2, SQLite can be
 | 
			
		||||
   used in a multithreaded program so long as no two
 | 
			
		||||
   threads attempt to use the same database connection at
 | 
			
		||||
   the same time.
 | 
			
		||||
 | 
			
		||||
   NOTE: This is the preferred threading model, but not
 | 
			
		||||
   currently enabled because we need to investigate our
 | 
			
		||||
   use-model and concurrency requirements.
 | 
			
		||||
 | 
			
		||||
   TODO: consider whether any other options should be
 | 
			
		||||
   used: https://www.sqlite.org/compile.html
 | 
			
		||||
#]=========================================================]
 | 
			
		||||
 | 
			
		||||
target_compile_definitions (sqlite3
 | 
			
		||||
  PRIVATE
 | 
			
		||||
    SQLITE_THREADSAFE=1
 | 
			
		||||
    HAVE_USLEEP=1)
 | 
			
		||||
target_compile_options (sqlite3
 | 
			
		||||
  PRIVATE
 | 
			
		||||
    $<$<BOOL:${MSVC}>:
 | 
			
		||||
      -wd4100
 | 
			
		||||
      -wd4127
 | 
			
		||||
      -wd4232
 | 
			
		||||
      -wd4244
 | 
			
		||||
      -wd4701
 | 
			
		||||
      -wd4706
 | 
			
		||||
      -wd4996
 | 
			
		||||
    >
 | 
			
		||||
    $<$<NOT:$<BOOL:${MSVC}>>:-Wno-array-bounds>)
 | 
			
		||||
install (
 | 
			
		||||
  TARGETS
 | 
			
		||||
    sqlite3
 | 
			
		||||
  LIBRARY DESTINATION lib
 | 
			
		||||
  ARCHIVE DESTINATION lib
 | 
			
		||||
  RUNTIME DESTINATION bin
 | 
			
		||||
  INCLUDES DESTINATION include)
 | 
			
		||||
install (
 | 
			
		||||
  FILES
 | 
			
		||||
    sqlite3.h
 | 
			
		||||
    sqlite3ext.h
 | 
			
		||||
  DESTINATION include)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,39 +0,0 @@
 | 
			
		||||
#[===================================================================[
 | 
			
		||||
   multiconfig misc
 | 
			
		||||
#]===================================================================]
 | 
			
		||||
 | 
			
		||||
if (is_multiconfig)
 | 
			
		||||
  # This code finds all source files in the src subdirectory for inclusion
 | 
			
		||||
  # in the IDE file tree as non-compiled sources. Since this file list will
 | 
			
		||||
  # have some overlap with files we have already added to our targets to
 | 
			
		||||
  # be compiled, we explicitly remove any of these target source files from
 | 
			
		||||
  # this list.
 | 
			
		||||
  file (GLOB_RECURSE all_sources RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
 | 
			
		||||
    CONFIGURE_DEPENDS
 | 
			
		||||
    src/*.* Builds/*.md docs/*.md src/*.md Builds/*.cmake)
 | 
			
		||||
  file(GLOB md_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} CONFIGURE_DEPENDS
 | 
			
		||||
    *.md)
 | 
			
		||||
  LIST(APPEND all_sources ${md_files})
 | 
			
		||||
  foreach (_target secp256k1::secp256k1 ed25519::ed25519 xrpl_core rippled)
 | 
			
		||||
    get_target_property (_type ${_target} TYPE)
 | 
			
		||||
    if(_type STREQUAL "INTERFACE_LIBRARY")
 | 
			
		||||
      continue()
 | 
			
		||||
    endif()
 | 
			
		||||
    get_target_property (_src ${_target} SOURCES)
 | 
			
		||||
    list (REMOVE_ITEM all_sources ${_src})
 | 
			
		||||
  endforeach ()
 | 
			
		||||
  target_sources (rippled PRIVATE ${all_sources})
 | 
			
		||||
  set_property (
 | 
			
		||||
    SOURCE ${all_sources}
 | 
			
		||||
    APPEND
 | 
			
		||||
    PROPERTY HEADER_FILE_ONLY true)
 | 
			
		||||
  if (MSVC)
 | 
			
		||||
    set_property(
 | 
			
		||||
      DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
 | 
			
		||||
      PROPERTY VS_STARTUP_PROJECT rippled)
 | 
			
		||||
  endif ()
 | 
			
		||||
 | 
			
		||||
  group_sources(src)
 | 
			
		||||
  group_sources(docs)
 | 
			
		||||
  group_sources(Builds)
 | 
			
		||||
endif ()
 | 
			
		||||
@@ -1,180 +0,0 @@
 | 
			
		||||
#[===================================================================[
 | 
			
		||||
   package/container targets - (optional)
 | 
			
		||||
#]===================================================================]
 | 
			
		||||
 | 
			
		||||
if (is_root_project)
 | 
			
		||||
  if (NOT DOCKER)
 | 
			
		||||
    find_program (DOCKER docker)
 | 
			
		||||
  endif ()
 | 
			
		||||
 | 
			
		||||
  if (DOCKER)
 | 
			
		||||
    # if no container label is provided, use current git hash
 | 
			
		||||
    git_hash (commit_hash)
 | 
			
		||||
    if (NOT container_label)
 | 
			
		||||
      set (container_label ${commit_hash})
 | 
			
		||||
    endif ()
 | 
			
		||||
    message (STATUS "using [${container_label}] as build container tag...")
 | 
			
		||||
 | 
			
		||||
    file (MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/packages)
 | 
			
		||||
 | 
			
		||||
    #[===================================================================[
 | 
			
		||||
        rpm
 | 
			
		||||
    #]===================================================================]
 | 
			
		||||
    add_custom_target (rpm_container
 | 
			
		||||
      docker build
 | 
			
		||||
        --pull
 | 
			
		||||
        --build-arg GIT_COMMIT=${commit_hash}
 | 
			
		||||
        -t rippleci/rippled-rpm-builder:${container_label}
 | 
			
		||||
        $<$<BOOL:${rpm_cache_from}>:--cache-from=${rpm_cache_from}>
 | 
			
		||||
        -f centos-builder/Dockerfile .
 | 
			
		||||
      WORKING_DIRECTORY  ${CMAKE_CURRENT_SOURCE_DIR}/Builds/containers
 | 
			
		||||
      VERBATIM
 | 
			
		||||
      USES_TERMINAL
 | 
			
		||||
      COMMAND_EXPAND_LISTS
 | 
			
		||||
      SOURCES
 | 
			
		||||
        Builds/containers/centos-builder/Dockerfile
 | 
			
		||||
        Builds/containers/centos-builder/centos_setup.sh
 | 
			
		||||
        Builds/containers/shared/update-rippled.sh
 | 
			
		||||
        Builds/containers/shared/update_sources.sh
 | 
			
		||||
        Builds/containers/shared/rippled.service
 | 
			
		||||
        Builds/containers/shared/rippled-reporting.service
 | 
			
		||||
        Builds/containers/packaging/rpm/rippled.spec
 | 
			
		||||
        Builds/containers/packaging/rpm/build_rpm.sh
 | 
			
		||||
        Builds/containers/packaging/rpm/50-rippled.preset
 | 
			
		||||
        Builds/containers/packaging/rpm/50-rippled-reporting.preset
 | 
			
		||||
        bin/getRippledInfo
 | 
			
		||||
    )
 | 
			
		||||
    exclude_from_default (rpm_container)
 | 
			
		||||
    add_custom_target (rpm
 | 
			
		||||
      docker run
 | 
			
		||||
        -v ${CMAKE_CURRENT_SOURCE_DIR}:/opt/rippled_bld/pkg/rippled
 | 
			
		||||
        -v ${CMAKE_CURRENT_BINARY_DIR}/packages:/opt/rippled_bld/pkg/out
 | 
			
		||||
        -t rippled-rpm-builder:${container_label}
 | 
			
		||||
        /bin/bash -c "cp -fpu rippled/Builds/containers/packaging/rpm/build_rpm.sh . && ./build_rpm.sh"
 | 
			
		||||
      VERBATIM
 | 
			
		||||
      USES_TERMINAL
 | 
			
		||||
      COMMAND_EXPAND_LISTS
 | 
			
		||||
      SOURCES
 | 
			
		||||
        Builds/containers/packaging/rpm/rippled.spec
 | 
			
		||||
    )
 | 
			
		||||
    exclude_from_default (rpm)
 | 
			
		||||
    if (NOT have_package_container)
 | 
			
		||||
      add_dependencies(rpm rpm_container)
 | 
			
		||||
    endif ()
 | 
			
		||||
    #[===================================================================[
 | 
			
		||||
        dpkg
 | 
			
		||||
    #]===================================================================]
 | 
			
		||||
    # currently use ubuntu 18.04 as a base b/c it has one of
 | 
			
		||||
    # the lower versions of libc among ubuntu and debian releases.
 | 
			
		||||
    # we could change this in the future and build with some other deb
 | 
			
		||||
    # based system.
 | 
			
		||||
    add_custom_target (dpkg_container
 | 
			
		||||
      docker build
 | 
			
		||||
        --pull
 | 
			
		||||
        --build-arg DIST_TAG=18.04
 | 
			
		||||
        --build-arg GIT_COMMIT=${commit_hash}
 | 
			
		||||
        -t rippled-dpkg-builder:${container_label}
 | 
			
		||||
        $<$<BOOL:${dpkg_cache_from}>:--cache-from=${dpkg_cache_from}>
 | 
			
		||||
        -f ubuntu-builder/Dockerfile .
 | 
			
		||||
      WORKING_DIRECTORY  ${CMAKE_CURRENT_SOURCE_DIR}/Builds/containers
 | 
			
		||||
      VERBATIM
 | 
			
		||||
      USES_TERMINAL
 | 
			
		||||
      COMMAND_EXPAND_LISTS
 | 
			
		||||
      SOURCES
 | 
			
		||||
        Builds/containers/packaging/dpkg/debian/rippled-reporting.links
 | 
			
		||||
        Builds/containers/packaging/dpkg/debian/copyright
 | 
			
		||||
        Builds/containers/packaging/dpkg/debian/rules
 | 
			
		||||
        Builds/containers/packaging/dpkg/debian/rippled-reporting.install
 | 
			
		||||
        Builds/containers/packaging/dpkg/debian/rippled-reporting.postinst
 | 
			
		||||
        Builds/containers/packaging/dpkg/debian/rippled.links
 | 
			
		||||
        Builds/containers/packaging/dpkg/debian/rippled.prerm
 | 
			
		||||
        Builds/containers/packaging/dpkg/debian/rippled.postinst
 | 
			
		||||
        Builds/containers/packaging/dpkg/debian/rippled-dev.install
 | 
			
		||||
        Builds/containers/packaging/dpkg/debian/dirs
 | 
			
		||||
        Builds/containers/packaging/dpkg/debian/rippled.postrm
 | 
			
		||||
        Builds/containers/packaging/dpkg/debian/rippled.conffiles
 | 
			
		||||
        Builds/containers/packaging/dpkg/debian/compat
 | 
			
		||||
        Builds/containers/packaging/dpkg/debian/source/format
 | 
			
		||||
        Builds/containers/packaging/dpkg/debian/source/local-options
 | 
			
		||||
        Builds/containers/packaging/dpkg/debian/README.Debian
 | 
			
		||||
        Builds/containers/packaging/dpkg/debian/rippled.install
 | 
			
		||||
        Builds/containers/packaging/dpkg/debian/rippled.preinst
 | 
			
		||||
        Builds/containers/packaging/dpkg/debian/docs
 | 
			
		||||
        Builds/containers/packaging/dpkg/debian/control
 | 
			
		||||
        Builds/containers/packaging/dpkg/debian/rippled-reporting.dirs
 | 
			
		||||
        Builds/containers/packaging/dpkg/build_dpkg.sh
 | 
			
		||||
        Builds/containers/ubuntu-builder/Dockerfile
 | 
			
		||||
        Builds/containers/ubuntu-builder/ubuntu_setup.sh
 | 
			
		||||
        bin/getRippledInfo
 | 
			
		||||
        Builds/containers/shared/install_cmake.sh
 | 
			
		||||
        Builds/containers/shared/update-rippled.sh
 | 
			
		||||
        Builds/containers/shared/update_sources.sh
 | 
			
		||||
        Builds/containers/shared/rippled.service
 | 
			
		||||
        Builds/containers/shared/rippled-reporting.service
 | 
			
		||||
        Builds/containers/shared/rippled-logrotate
 | 
			
		||||
        Builds/containers/shared/update-rippled-cron
 | 
			
		||||
    )
 | 
			
		||||
    exclude_from_default (dpkg_container)
 | 
			
		||||
    add_custom_target (dpkg
 | 
			
		||||
      docker run
 | 
			
		||||
        -v ${CMAKE_CURRENT_SOURCE_DIR}:/opt/rippled_bld/pkg/rippled
 | 
			
		||||
        -v ${CMAKE_CURRENT_BINARY_DIR}/packages:/opt/rippled_bld/pkg/out
 | 
			
		||||
        -t rippled-dpkg-builder:${container_label}
 | 
			
		||||
        /bin/bash -c "cp -fpu rippled/Builds/containers/packaging/dpkg/build_dpkg.sh . && ./build_dpkg.sh"
 | 
			
		||||
      VERBATIM
 | 
			
		||||
      USES_TERMINAL
 | 
			
		||||
      COMMAND_EXPAND_LISTS
 | 
			
		||||
      SOURCES
 | 
			
		||||
        Builds/containers/packaging/dpkg/debian/control
 | 
			
		||||
    )
 | 
			
		||||
    exclude_from_default (dpkg)
 | 
			
		||||
    if (NOT have_package_container)
 | 
			
		||||
      add_dependencies(dpkg dpkg_container)
 | 
			
		||||
    endif ()
 | 
			
		||||
    #[===================================================================[
 | 
			
		||||
        ci container
 | 
			
		||||
    #]===================================================================]
 | 
			
		||||
    # now use the same ubuntu image for our travis-ci docker images,
 | 
			
		||||
    # but we use a newer distro (18.04 vs 16.04).
 | 
			
		||||
    #
 | 
			
		||||
    # the following steps assume the github pkg repo, but it's possible to
 | 
			
		||||
    # adapt these for other docker hub repositories.
 | 
			
		||||
    #
 | 
			
		||||
    # steps for publishing a new CI image when you make changes:
 | 
			
		||||
    #
 | 
			
		||||
    #   mkdir bld.ci && cd bld.ci && cmake -Dpackages_only=ON -Dcontainer_label=CI_LATEST
 | 
			
		||||
    #   cmake --build . --target ci_container --verbose
 | 
			
		||||
    #   docker tag rippled-ci-builder:CI_LATEST <HUB REPO PATH>/rippled-ci-builder:YYYY-MM-DD
 | 
			
		||||
    #      (NOTE: change YYYY-MM-DD to match current date, or use a different
 | 
			
		||||
    #             tag/version scheme if you prefer)
 | 
			
		||||
    #   docker push <HUB REPO PATH>/rippled-ci-builder:YYYY-MM-DD
 | 
			
		||||
    #      (NOTE: <HUB REPO PATH> is probably your user or org name if using
 | 
			
		||||
    #             docker hub, or it might be something like
 | 
			
		||||
    #             docker.pkg.github.com/ripple/rippled if using the github pkg
 | 
			
		||||
    #             registry. for any registry, you will need to be logged-in via
 | 
			
		||||
    #             docker and have push access.)
 | 
			
		||||
    #
 | 
			
		||||
    # ...then change the DOCKER_IMAGE line in .travis.yml :
 | 
			
		||||
    #     - DOCKER_IMAGE="<HUB REPO PATH>/rippled-ci-builder:YYYY-MM-DD"
 | 
			
		||||
    add_custom_target (ci_container
 | 
			
		||||
      docker build
 | 
			
		||||
        --pull
 | 
			
		||||
        --build-arg DIST_TAG=18.04
 | 
			
		||||
        --build-arg GIT_COMMIT=${commit_hash}
 | 
			
		||||
        --build-arg CI_USE=true
 | 
			
		||||
        -t rippled-ci-builder:${container_label}
 | 
			
		||||
        $<$<BOOL:${ci_cache_from}>:--cache-from=${ci_cache_from}>
 | 
			
		||||
        -f ubuntu-builder/Dockerfile .
 | 
			
		||||
      WORKING_DIRECTORY  ${CMAKE_CURRENT_SOURCE_DIR}/Builds/containers
 | 
			
		||||
      VERBATIM
 | 
			
		||||
      USES_TERMINAL
 | 
			
		||||
      COMMAND_EXPAND_LISTS
 | 
			
		||||
      SOURCES
 | 
			
		||||
        Builds/containers/ubuntu-builder/Dockerfile
 | 
			
		||||
        Builds/containers/ubuntu-builder/ubuntu_setup.sh
 | 
			
		||||
    )
 | 
			
		||||
    exclude_from_default (ci_container)
 | 
			
		||||
  else ()
 | 
			
		||||
    message (STATUS "docker NOT found -- won't be able to build containers for packaging")
 | 
			
		||||
  endif ()
 | 
			
		||||
endif ()
 | 
			
		||||
@@ -1,15 +0,0 @@
 | 
			
		||||
#[===================================================================[
 | 
			
		||||
   read version from source
 | 
			
		||||
#]===================================================================]
 | 
			
		||||
 | 
			
		||||
file (STRINGS src/ripple/protocol/impl/BuildInfo.cpp BUILD_INFO)
 | 
			
		||||
foreach (line_ ${BUILD_INFO})
 | 
			
		||||
  if (line_ MATCHES "versionString[ ]*=[ ]*\"(.+)\"")
 | 
			
		||||
    set (rippled_version ${CMAKE_MATCH_1})
 | 
			
		||||
  endif ()
 | 
			
		||||
endforeach ()
 | 
			
		||||
if (rippled_version)
 | 
			
		||||
  message (STATUS "rippled version: ${rippled_version}")
 | 
			
		||||
else ()
 | 
			
		||||
  message (FATAL_ERROR "unable to determine rippled version")
 | 
			
		||||
endif ()
 | 
			
		||||
@@ -1,106 +0,0 @@
 | 
			
		||||
################################################################################
 | 
			
		||||
# SociConfig.cmake - CMake build configuration of SOCI library
 | 
			
		||||
################################################################################
 | 
			
		||||
# Copyright (C) 2010 Mateusz Loskot <mateusz@loskot.net>
 | 
			
		||||
#
 | 
			
		||||
# Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
# (See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
# http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
################################################################################
 | 
			
		||||
 | 
			
		||||
include(CheckCXXSymbolExists)
 | 
			
		||||
 | 
			
		||||
if(WIN32)
 | 
			
		||||
  check_cxx_symbol_exists("_M_AMD64" "" SOCI_TARGET_ARCH_X64)
 | 
			
		||||
  if(NOT RTC_ARCH_X64)
 | 
			
		||||
    check_cxx_symbol_exists("_M_IX86" "" SOCI_TARGET_ARCH_X86)
 | 
			
		||||
  endif(NOT RTC_ARCH_X64)
 | 
			
		||||
  # add check for arm here
 | 
			
		||||
  # see http://msdn.microsoft.com/en-us/library/b0084kay.aspx
 | 
			
		||||
else(WIN32)
 | 
			
		||||
  check_cxx_symbol_exists("__i386__" "" SOCI_TARGET_ARCH_X86)
 | 
			
		||||
  check_cxx_symbol_exists("__x86_64__" "" SOCI_TARGET_ARCH_X64)
 | 
			
		||||
  check_cxx_symbol_exists("__arm__" "" SOCI_TARGET_ARCH_ARM)
 | 
			
		||||
endif(WIN32)
 | 
			
		||||
 | 
			
		||||
if(NOT DEFINED LIB_SUFFIX)
 | 
			
		||||
  if(SOCI_TARGET_ARCH_X64)
 | 
			
		||||
    set(_lib_suffix "64")
 | 
			
		||||
  else()
 | 
			
		||||
    set(_lib_suffix "")
 | 
			
		||||
  endif()
 | 
			
		||||
  set(LIB_SUFFIX ${_lib_suffix} CACHE STRING "Specifies suffix for the lib directory")
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# C++11 Option
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
if(NOT SOCI_CXX_C11)
 | 
			
		||||
  set (SOCI_CXX_C11 OFF CACHE BOOL "Build to the C++11 standard")
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Force compilation flags and set desired warnings level
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
if (MSVC)
 | 
			
		||||
  add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
 | 
			
		||||
  add_definitions(-D_CRT_SECURE_NO_WARNINGS)
 | 
			
		||||
  add_definitions(-D_CRT_NONSTDC_NO_WARNING)
 | 
			
		||||
  add_definitions(-D_SCL_SECURE_NO_WARNINGS)
 | 
			
		||||
 | 
			
		||||
  if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
 | 
			
		||||
    string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
 | 
			
		||||
  else()
 | 
			
		||||
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4 /we4266")
 | 
			
		||||
  endif()
 | 
			
		||||
 | 
			
		||||
else()
 | 
			
		||||
 | 
			
		||||
  set(SOCI_GCC_CLANG_COMMON_FLAGS "")
 | 
			
		||||
    # "-pedantic -Werror -Wno-error=parentheses -Wall -Wextra -Wpointer-arith -Wcast-align -Wcast-qual -Wfloat-equal -Woverloaded-virtual -Wredundant-decls -Wno-long-long")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  if (SOCI_CXX_C11)
 | 
			
		||||
    set(SOCI_CXX_VERSION_FLAGS "-std=c++11")
 | 
			
		||||
  else()
 | 
			
		||||
    set(SOCI_CXX_VERSION_FLAGS "-std=gnu++98")
 | 
			
		||||
  endif()
 | 
			
		||||
 | 
			
		||||
  if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" OR "${CMAKE_CXX_COMPILER}" MATCHES "clang")
 | 
			
		||||
 | 
			
		||||
    if(NOT CMAKE_CXX_COMPILER_VERSION LESS 3.1 AND SOCI_ASAN)
 | 
			
		||||
      set(SOCI_GCC_CLANG_COMMON_FLAGS "${SOCI_GCC_CLANG_COMMON_FLAGS} -fsanitize=address")
 | 
			
		||||
    endif()
 | 
			
		||||
 | 
			
		||||
    # enforce C++11 for Clang
 | 
			
		||||
    set(SOCI_CXX_C11 ON)
 | 
			
		||||
    set(SOCI_CXX_VERSION_FLAGS "-std=c++11")
 | 
			
		||||
    add_definitions(-DCATCH_CONFIG_CPP11_NO_IS_ENUM)
 | 
			
		||||
 | 
			
		||||
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SOCI_GCC_CLANG_COMMON_FLAGS} ${SOCI_CXX_VERSION_FLAGS}")
 | 
			
		||||
 | 
			
		||||
  elseif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
 | 
			
		||||
 | 
			
		||||
    if(NOT CMAKE_CXX_COMPILER_VERSION LESS 4.8 AND SOCI_ASAN)
 | 
			
		||||
      set(SOCI_GCC_CLANG_COMMON_FLAGS "${SOCI_GCC_CLANG_COMMON_FLAGS} -fsanitize=address")
 | 
			
		||||
    endif()
 | 
			
		||||
 | 
			
		||||
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SOCI_GCC_CLANG_COMMON_FLAGS} ${SOCI_CXX_VERSION_FLAGS} ")
 | 
			
		||||
    if (CMAKE_COMPILER_IS_GNUCXX)
 | 
			
		||||
        if (CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
 | 
			
		||||
            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
 | 
			
		||||
        else()
 | 
			
		||||
            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-variadic-macros")
 | 
			
		||||
        endif()
 | 
			
		||||
    endif()
 | 
			
		||||
 | 
			
		||||
  else()
 | 
			
		||||
	message(WARNING "Unknown toolset - using default flags to build SOCI")
 | 
			
		||||
  endif()
 | 
			
		||||
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
# Set SOCI_HAVE_* variables for soci-config.h generator
 | 
			
		||||
set(SOCI_HAVE_CXX_C11 ${SOCI_CXX_C11} CACHE INTERNAL "Enables C++11 support")
 | 
			
		||||
@@ -1,27 +0,0 @@
 | 
			
		||||
find_package(Protobuf 3.8)
 | 
			
		||||
 | 
			
		||||
set(output_dir ${CMAKE_BINARY_DIR}/proto_gen)
 | 
			
		||||
file(MAKE_DIRECTORY ${output_dir})
 | 
			
		||||
set(ccbd ${CMAKE_CURRENT_BINARY_DIR})
 | 
			
		||||
set(CMAKE_CURRENT_BINARY_DIR ${output_dir})
 | 
			
		||||
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS src/ripple/proto/ripple.proto)
 | 
			
		||||
set(CMAKE_CURRENT_BINARY_DIR ${ccbd})
 | 
			
		||||
 | 
			
		||||
target_include_directories(xrpl_core SYSTEM PUBLIC
 | 
			
		||||
    # The generated implementation imports the header relative to the output
 | 
			
		||||
    # directory.
 | 
			
		||||
    $<BUILD_INTERFACE:${output_dir}>
 | 
			
		||||
    $<BUILD_INTERFACE:${output_dir}/src>
 | 
			
		||||
)
 | 
			
		||||
target_sources(xrpl_core PRIVATE ${output_dir}/src/ripple/proto/ripple.pb.cc)
 | 
			
		||||
install(
 | 
			
		||||
  FILES ${output_dir}/src/ripple/proto/ripple.pb.h
 | 
			
		||||
  DESTINATION include/ripple/proto)
 | 
			
		||||
target_link_libraries(xrpl_core PUBLIC protobuf::libprotobuf)
 | 
			
		||||
target_compile_options(xrpl_core
 | 
			
		||||
  PUBLIC
 | 
			
		||||
    $<$<BOOL:${XCODE}>:
 | 
			
		||||
      --system-header-prefix="google/protobuf"
 | 
			
		||||
      -Wno-deprecated-dynamic-exception-spec
 | 
			
		||||
    >
 | 
			
		||||
)
 | 
			
		||||
@@ -1,82 +0,0 @@
 | 
			
		||||
find_package(gRPC 1.23)
 | 
			
		||||
 | 
			
		||||
#[=================================[
 | 
			
		||||
   generate protobuf sources for
 | 
			
		||||
   grpc defs and bundle into a
 | 
			
		||||
   static lib
 | 
			
		||||
#]=================================]
 | 
			
		||||
set(output_dir "${CMAKE_BINARY_DIR}/proto_gen_grpc")
 | 
			
		||||
set(GRPC_GEN_DIR "${output_dir}/ripple/proto")
 | 
			
		||||
file(MAKE_DIRECTORY ${GRPC_GEN_DIR})
 | 
			
		||||
set(GRPC_PROTO_SRCS)
 | 
			
		||||
set(GRPC_PROTO_HDRS)
 | 
			
		||||
set(GRPC_PROTO_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/src/ripple/proto/org")
 | 
			
		||||
file(GLOB_RECURSE GRPC_DEFINITION_FILES "${GRPC_PROTO_ROOT}/*.proto")
 | 
			
		||||
foreach(file ${GRPC_DEFINITION_FILES})
 | 
			
		||||
  # /home/user/rippled/src/ripple/proto/org/.../v1/get_ledger.proto
 | 
			
		||||
  get_filename_component(_abs_file ${file} ABSOLUTE)
 | 
			
		||||
  # /home/user/rippled/src/ripple/proto/org/.../v1
 | 
			
		||||
  get_filename_component(_abs_dir ${_abs_file} DIRECTORY)
 | 
			
		||||
  # get_ledger
 | 
			
		||||
  get_filename_component(_basename ${file} NAME_WE)
 | 
			
		||||
  # /home/user/rippled/src/ripple/proto
 | 
			
		||||
  get_filename_component(_proto_inc ${GRPC_PROTO_ROOT} DIRECTORY) # updir one level
 | 
			
		||||
  # org/.../v1/get_ledger.proto
 | 
			
		||||
  file(RELATIVE_PATH _rel_root_file ${_proto_inc} ${_abs_file})
 | 
			
		||||
  # org/.../v1
 | 
			
		||||
  get_filename_component(_rel_root_dir ${_rel_root_file} DIRECTORY)
 | 
			
		||||
  # src/ripple/proto/org/.../v1
 | 
			
		||||
  file(RELATIVE_PATH _rel_dir ${CMAKE_CURRENT_SOURCE_DIR} ${_abs_dir})
 | 
			
		||||
 | 
			
		||||
  # .cmake/proto_gen_grpc/ripple/proto/org/.../v1/get_ledger.grpc.pb.cc
 | 
			
		||||
  set(src_1 "${GRPC_GEN_DIR}/${_rel_root_dir}/${_basename}.grpc.pb.cc")
 | 
			
		||||
  set(src_2 "${GRPC_GEN_DIR}/${_rel_root_dir}/${_basename}.pb.cc")
 | 
			
		||||
  set(hdr_1 "${GRPC_GEN_DIR}/${_rel_root_dir}/${_basename}.grpc.pb.h")
 | 
			
		||||
  set(hdr_2 "${GRPC_GEN_DIR}/${_rel_root_dir}/${_basename}.pb.h")
 | 
			
		||||
  add_custom_command(
 | 
			
		||||
    OUTPUT ${src_1} ${src_2} ${hdr_1} ${hdr_2}
 | 
			
		||||
    COMMAND protobuf::protoc
 | 
			
		||||
    ARGS --grpc_out=${GRPC_GEN_DIR}
 | 
			
		||||
         --cpp_out=${GRPC_GEN_DIR}
 | 
			
		||||
         --plugin=protoc-gen-grpc=$<TARGET_FILE:gRPC::grpc_cpp_plugin>
 | 
			
		||||
         -I ${_proto_inc} -I ${_rel_dir}
 | 
			
		||||
         ${_abs_file}
 | 
			
		||||
    DEPENDS ${_abs_file} protobuf::protoc gRPC::grpc_cpp_plugin
 | 
			
		||||
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
 | 
			
		||||
    COMMENT "Running gRPC C++ protocol buffer compiler on ${file}"
 | 
			
		||||
    VERBATIM)
 | 
			
		||||
    set_source_files_properties(${src_1} ${src_2} ${hdr_1} ${hdr_2} PROPERTIES
 | 
			
		||||
      GENERATED TRUE
 | 
			
		||||
      SKIP_UNITY_BUILD_INCLUSION ON
 | 
			
		||||
    )
 | 
			
		||||
    list(APPEND GRPC_PROTO_SRCS ${src_1} ${src_2})
 | 
			
		||||
    list(APPEND GRPC_PROTO_HDRS ${hdr_1} ${hdr_2})
 | 
			
		||||
endforeach()
 | 
			
		||||
 | 
			
		||||
target_include_directories(xrpl_core SYSTEM PUBLIC
 | 
			
		||||
  $<BUILD_INTERFACE:${output_dir}>
 | 
			
		||||
  $<BUILD_INTERFACE:${output_dir}/ripple/proto>
 | 
			
		||||
  # The generated sources include headers relative to this path. Fix it later.
 | 
			
		||||
  $<INSTALL_INTERFACE:include/ripple/proto>
 | 
			
		||||
)
 | 
			
		||||
target_sources(xrpl_core PRIVATE ${GRPC_PROTO_SRCS})
 | 
			
		||||
install(
 | 
			
		||||
  DIRECTORY ${output_dir}/ripple
 | 
			
		||||
  DESTINATION include/
 | 
			
		||||
  FILES_MATCHING PATTERN "*.h"
 | 
			
		||||
)
 | 
			
		||||
target_link_libraries(xrpl_core PUBLIC
 | 
			
		||||
  "gRPC::grpc++"
 | 
			
		||||
  # libgrpc is missing references.
 | 
			
		||||
  absl::random_random
 | 
			
		||||
)
 | 
			
		||||
target_compile_options(xrpl_core
 | 
			
		||||
  PRIVATE
 | 
			
		||||
    $<$<BOOL:${MSVC}>:-wd4065>
 | 
			
		||||
    $<$<NOT:$<BOOL:${MSVC}>>:-Wno-deprecated-declarations>
 | 
			
		||||
  PUBLIC
 | 
			
		||||
    $<$<BOOL:${MSVC}>:-wd4996>
 | 
			
		||||
    $<$<BOOL:${XCODE}>:
 | 
			
		||||
      --system-header-prefix="google/protobuf"
 | 
			
		||||
      -Wno-deprecated-dynamic-exception-spec
 | 
			
		||||
    >)
 | 
			
		||||
@@ -1,17 +0,0 @@
 | 
			
		||||
#[=========================================================[
 | 
			
		||||
  This is a CMake script file that is used to write
 | 
			
		||||
  the contents of a file to stdout (using the cmake
 | 
			
		||||
  echo command). The input file is passed via the
 | 
			
		||||
  IN_FILE variable.
 | 
			
		||||
#]=========================================================]
 | 
			
		||||
 | 
			
		||||
if (EXISTS ${IN_FILE})
 | 
			
		||||
  file (READ ${IN_FILE} contents)
 | 
			
		||||
  ## only print files that actually have some text in them
 | 
			
		||||
  if (contents MATCHES "[a-z0-9A-Z]+")
 | 
			
		||||
    execute_process(
 | 
			
		||||
      COMMAND
 | 
			
		||||
        ${CMAKE_COMMAND} -E echo "${contents}")
 | 
			
		||||
  endif ()
 | 
			
		||||
endif ()
 | 
			
		||||
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
[Please see the BUILD instructions here](../BUILD.md)
 | 
			
		||||
							
								
								
									
										405
									
								
								Builds/Test.py
									
									
									
									
									
								
							
							
						
						
									
										405
									
								
								Builds/Test.py
									
									
									
									
									
								
							@@ -1,405 +0,0 @@
 | 
			
		||||
#!/usr/bin/env python
 | 
			
		||||
 | 
			
		||||
#    This file is part of rippled: https://github.com/ripple/rippled
 | 
			
		||||
#    Copyright (c) 2012 - 2017 Ripple Labs Inc.
 | 
			
		||||
#
 | 
			
		||||
#    Permission to use, copy, modify, and/or distribute this software for any
 | 
			
		||||
#    purpose  with  or without fee is hereby granted, provided that the above
 | 
			
		||||
#    copyright notice and this permission notice appear in all copies.
 | 
			
		||||
#
 | 
			
		||||
#    THE  SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 | 
			
		||||
#    WITH  REGARD  TO  THIS  SOFTWARE  INCLUDING  ALL  IMPLIED  WARRANTIES  OF
 | 
			
		||||
#    MERCHANTABILITY  AND  FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 | 
			
		||||
#    ANY  SPECIAL ,  DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 | 
			
		||||
#    WHATSOEVER  RESULTING  FROM  LOSS  OF USE, DATA OR PROFITS, WHETHER IN AN
 | 
			
		||||
#    ACTION  OF  CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 | 
			
		||||
#    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
Invocation:
 | 
			
		||||
 | 
			
		||||
    ./Builds/Test.py - builds and tests all configurations
 | 
			
		||||
 | 
			
		||||
The build must succeed without shell aliases for this to work.
 | 
			
		||||
 | 
			
		||||
To pass flags to cmake, put them at the very end of the command line, after
 | 
			
		||||
the -- flag - like this:
 | 
			
		||||
 | 
			
		||||
    ./Builds/Test.py -- -j4  # Pass -j4 to cmake --build
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Common problems:
 | 
			
		||||
 | 
			
		||||
1) Boost not found. Solution: export BOOST_ROOT=[path to boost folder]
 | 
			
		||||
 | 
			
		||||
2) OpenSSL not found. Solution: export OPENSSL_ROOT=[path to OpenSSL folder]
 | 
			
		||||
 | 
			
		||||
3) cmake is not found. Solution: Be sure cmake directory is on your $PATH
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
from __future__ import absolute_import, division, print_function, unicode_literals
 | 
			
		||||
 | 
			
		||||
import argparse
 | 
			
		||||
import itertools
 | 
			
		||||
import os
 | 
			
		||||
import platform
 | 
			
		||||
import re
 | 
			
		||||
import shutil
 | 
			
		||||
import sys
 | 
			
		||||
import subprocess
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def powerset(iterable):
 | 
			
		||||
    """powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"""
 | 
			
		||||
    s = list(iterable)
 | 
			
		||||
    return itertools.chain.from_iterable(itertools.combinations(s, r) for r in range(len(s) + 1))
 | 
			
		||||
 | 
			
		||||
IS_WINDOWS = platform.system().lower() == 'windows'
 | 
			
		||||
IS_OS_X = platform.system().lower() == 'darwin'
 | 
			
		||||
 | 
			
		||||
# CMake
 | 
			
		||||
if IS_WINDOWS:
 | 
			
		||||
    CMAKE_UNITY_CONFIGS = ['Debug', 'Release']
 | 
			
		||||
    CMAKE_NONUNITY_CONFIGS = ['Debug', 'Release']
 | 
			
		||||
else:
 | 
			
		||||
    CMAKE_UNITY_CONFIGS = []
 | 
			
		||||
    CMAKE_NONUNITY_CONFIGS = []
 | 
			
		||||
CMAKE_UNITY_COMBOS = { '' : [['rippled'], CMAKE_UNITY_CONFIGS],
 | 
			
		||||
    '.nounity' : [['rippled'], CMAKE_NONUNITY_CONFIGS] }
 | 
			
		||||
 | 
			
		||||
if IS_WINDOWS:
 | 
			
		||||
    CMAKE_DIR_TARGETS = { ('msvc' + unity,) : targets for unity, targets in
 | 
			
		||||
        CMAKE_UNITY_COMBOS.items() }
 | 
			
		||||
elif IS_OS_X:
 | 
			
		||||
    CMAKE_DIR_TARGETS = { (build + unity,) : targets
 | 
			
		||||
                   for build in ['debug', 'release']
 | 
			
		||||
                   for unity, targets in CMAKE_UNITY_COMBOS.items() }
 | 
			
		||||
else:
 | 
			
		||||
    CMAKE_DIR_TARGETS = { (cc + "." + build + unity,) : targets
 | 
			
		||||
                   for cc in ['gcc', 'clang']
 | 
			
		||||
                   for build in ['debug', 'release', 'coverage', 'profile']
 | 
			
		||||
                   for unity, targets in CMAKE_UNITY_COMBOS.items() }
 | 
			
		||||
 | 
			
		||||
# list of tuples of all possible options
 | 
			
		||||
if IS_WINDOWS or IS_OS_X:
 | 
			
		||||
    CMAKE_ALL_GENERATE_OPTIONS = [tuple(x) for x in powerset(['-GNinja', '-Dassert=true'])]
 | 
			
		||||
else:
 | 
			
		||||
    CMAKE_ALL_GENERATE_OPTIONS = list(set(
 | 
			
		||||
        [tuple(x) for x in powerset(['-GNinja', '-Dstatic=true', '-Dassert=true', '-Dsan=address'])] +
 | 
			
		||||
        [tuple(x) for x in powerset(['-GNinja', '-Dstatic=true', '-Dassert=true', '-Dsan=thread'])]))
 | 
			
		||||
 | 
			
		||||
parser = argparse.ArgumentParser(
 | 
			
		||||
    description='Test.py - run ripple tests'
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
parser.add_argument(
 | 
			
		||||
    '--all', '-a',
 | 
			
		||||
    action='store_true',
 | 
			
		||||
    help='Build all configurations.',
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
parser.add_argument(
 | 
			
		||||
    '--keep_going', '-k',
 | 
			
		||||
    action='store_true',
 | 
			
		||||
    help='Keep going after one configuration has failed.',
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
parser.add_argument(
 | 
			
		||||
    '--silent', '-s',
 | 
			
		||||
    action='store_true',
 | 
			
		||||
    help='Silence all messages except errors',
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
parser.add_argument(
 | 
			
		||||
    '--verbose', '-v',
 | 
			
		||||
    action='store_true',
 | 
			
		||||
    help=('Report more information about which commands are executed and the '
 | 
			
		||||
          'results.'),
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
parser.add_argument(
 | 
			
		||||
    '--test', '-t',
 | 
			
		||||
    default='',
 | 
			
		||||
    help='Add a prefix for unit tests',
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
parser.add_argument(
 | 
			
		||||
    '--testjobs',
 | 
			
		||||
    default='0',
 | 
			
		||||
    type=int,
 | 
			
		||||
    help='Run tests in parallel'
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
parser.add_argument(
 | 
			
		||||
    '--ipv6',
 | 
			
		||||
    action='store_true',
 | 
			
		||||
    help='Use IPv6 localhost when running unit tests.',
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
parser.add_argument(
 | 
			
		||||
    '--clean', '-c',
 | 
			
		||||
    action='store_true',
 | 
			
		||||
    help='delete all build artifacts after testing',
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
parser.add_argument(
 | 
			
		||||
    '--quiet', '-q',
 | 
			
		||||
    action='store_true',
 | 
			
		||||
    help='Reduce output where possible (unit tests)',
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
parser.add_argument(
 | 
			
		||||
    '--dir', '-d',
 | 
			
		||||
    default=(),
 | 
			
		||||
    nargs='*',
 | 
			
		||||
    help='Specify one or more CMake dir names. '
 | 
			
		||||
        'Will also be used as -Dtarget=<dir> running cmake.'
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
parser.add_argument(
 | 
			
		||||
    '--target',
 | 
			
		||||
    default=(),
 | 
			
		||||
    nargs='*',
 | 
			
		||||
    help='Specify one or more CMake build targets. '
 | 
			
		||||
        'Will be used as --target <target> running cmake --build.'
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
parser.add_argument(
 | 
			
		||||
    '--config',
 | 
			
		||||
    default=(),
 | 
			
		||||
    nargs='*',
 | 
			
		||||
    help='Specify one or more CMake build configs. '
 | 
			
		||||
        'Will be used as --config <config> running cmake --build.'
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
parser.add_argument(
 | 
			
		||||
    '--generator_option',
 | 
			
		||||
    action='append',
 | 
			
		||||
    help='Specify a CMake generator option. Repeat for multiple options. '
 | 
			
		||||
        'Will be passed to the cmake generator. '
 | 
			
		||||
        'Due to limits of the argument parser, arguments starting with \'-\' '
 | 
			
		||||
        'must be attached to this option. e.g. --generator_option=-GNinja.')
 | 
			
		||||
 | 
			
		||||
parser.add_argument(
 | 
			
		||||
    '--build_option',
 | 
			
		||||
    action='append',
 | 
			
		||||
    help='Specify a build option. Repeat for multiple options. '
 | 
			
		||||
        'Will be passed to the build tool via cmake --build. '
 | 
			
		||||
        'Due to limits of the argument parser, arguments starting with \'-\' '
 | 
			
		||||
        'must be attached to this option. e.g. --build_option=-j8.')
 | 
			
		||||
 | 
			
		||||
parser.add_argument(
 | 
			
		||||
    'extra_args',
 | 
			
		||||
    default=(),
 | 
			
		||||
    nargs='*',
 | 
			
		||||
    help='Extra arguments are passed through to the tools'
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
ARGS = parser.parse_args()
 | 
			
		||||
 | 
			
		||||
def decodeString(line):
 | 
			
		||||
    # Python 2 vs. Python 3
 | 
			
		||||
    if isinstance(line, str):
 | 
			
		||||
        return line
 | 
			
		||||
    else:
 | 
			
		||||
        return line.decode()
 | 
			
		||||
 | 
			
		||||
def shell(cmd, args=(), silent=False, cust_env=None):
 | 
			
		||||
    """"Execute a shell command and return the output."""
 | 
			
		||||
    silent = ARGS.silent or silent
 | 
			
		||||
    verbose = not silent and ARGS.verbose
 | 
			
		||||
    if verbose:
 | 
			
		||||
        print('$' + cmd, *args)
 | 
			
		||||
 | 
			
		||||
    command = (cmd,) + args
 | 
			
		||||
 | 
			
		||||
    # shell is needed in Windows to find executable in the path
 | 
			
		||||
    process = subprocess.Popen(
 | 
			
		||||
        command,
 | 
			
		||||
        stdin=subprocess.PIPE,
 | 
			
		||||
        stdout=subprocess.PIPE,
 | 
			
		||||
        stderr=subprocess.STDOUT,
 | 
			
		||||
        env=cust_env,
 | 
			
		||||
        shell=IS_WINDOWS)
 | 
			
		||||
    lines = []
 | 
			
		||||
    count = 0
 | 
			
		||||
    # readline returns '' at EOF
 | 
			
		||||
    for line in iter(process.stdout.readline, ''):
 | 
			
		||||
        if process.poll() is None:
 | 
			
		||||
            decoded = decodeString(line)
 | 
			
		||||
            lines.append(decoded)
 | 
			
		||||
            if verbose:
 | 
			
		||||
                print(decoded, end='')
 | 
			
		||||
            elif not silent:
 | 
			
		||||
                count += 1
 | 
			
		||||
                if count >= 80:
 | 
			
		||||
                    print()
 | 
			
		||||
                    count = 0
 | 
			
		||||
                else:
 | 
			
		||||
                    print('.', end='')
 | 
			
		||||
        else:
 | 
			
		||||
            break
 | 
			
		||||
 | 
			
		||||
    if not verbose and count:
 | 
			
		||||
        print()
 | 
			
		||||
    process.wait()
 | 
			
		||||
    return process.returncode, lines
 | 
			
		||||
 | 
			
		||||
def get_cmake_dir(cmake_dir):
 | 
			
		||||
    return os.path.join('build' , 'cmake' , cmake_dir)
 | 
			
		||||
 | 
			
		||||
def run_cmake(directory, cmake_dir, args):
 | 
			
		||||
    print('Generating build in', directory, 'with', *args or ('default options',))
 | 
			
		||||
    old_dir = os.getcwd()
 | 
			
		||||
    if not os.path.exists(directory):
 | 
			
		||||
        os.makedirs(directory)
 | 
			
		||||
    os.chdir(directory)
 | 
			
		||||
    if IS_WINDOWS and not any(arg.startswith("-G") for arg in args) and not os.path.exists("CMakeCache.txt"):
 | 
			
		||||
        if '--ninja' in args:
 | 
			
		||||
            args += ( '-GNinja', )
 | 
			
		||||
        else:
 | 
			
		||||
            args += ( '-GVisual Studio 14 2015 Win64', )
 | 
			
		||||
    # hack to extract cmake options/args from the legacy target format
 | 
			
		||||
    if re.search('\.unity', cmake_dir):
 | 
			
		||||
        args += ( '-Dunity=ON', )
 | 
			
		||||
    if re.search('\.nounity', cmake_dir):
 | 
			
		||||
        args += ( '-Dunity=OFF', )
 | 
			
		||||
    if re.search('coverage', cmake_dir):
 | 
			
		||||
        args += ( '-Dcoverage=ON', )
 | 
			
		||||
    if re.search('profile', cmake_dir):
 | 
			
		||||
        args += ( '-Dprofile=ON', )
 | 
			
		||||
    if re.search('debug', cmake_dir):
 | 
			
		||||
        args += ( '-DCMAKE_BUILD_TYPE=Debug', )
 | 
			
		||||
    if re.search('release', cmake_dir):
 | 
			
		||||
        args += ( '-DCMAKE_BUILD_TYPE=Release', )
 | 
			
		||||
    m = re.search('gcc(-[^.]*)', cmake_dir)
 | 
			
		||||
    if m:
 | 
			
		||||
        args += ( '-DCMAKE_C_COMPILER=' + m.group(0),
 | 
			
		||||
          '-DCMAKE_CXX_COMPILER=g++' + m.group(1), )
 | 
			
		||||
    elif re.search('gcc', cmake_dir):
 | 
			
		||||
        args += ( '-DCMAKE_C_COMPILER=gcc', '-DCMAKE_CXX_COMPILER=g++', )
 | 
			
		||||
    m = re.search('clang(-[^.]*)', cmake_dir)
 | 
			
		||||
    if m:
 | 
			
		||||
        args += ( '-DCMAKE_C_COMPILER=' + m.group(0),
 | 
			
		||||
          '-DCMAKE_CXX_COMPILER=clang++' + m.group(1), )
 | 
			
		||||
    elif re.search('clang', cmake_dir):
 | 
			
		||||
        args += ( '-DCMAKE_C_COMPILER=clang', '-DCMAKE_CXX_COMPILER=clang++', )
 | 
			
		||||
 | 
			
		||||
    args += ( os.path.join('..', '..', '..'), )
 | 
			
		||||
    resultcode, lines = shell('cmake', args)
 | 
			
		||||
 | 
			
		||||
    if resultcode:
 | 
			
		||||
        print('Generating FAILED:')
 | 
			
		||||
        if not ARGS.verbose:
 | 
			
		||||
            print(*lines, sep='')
 | 
			
		||||
        sys.exit(1)
 | 
			
		||||
 | 
			
		||||
    os.chdir(old_dir)
 | 
			
		||||
 | 
			
		||||
def run_cmake_build(directory, target, config, args):
 | 
			
		||||
    print('Building', target, config, 'in', directory, 'with', *args or ('default options',))
 | 
			
		||||
    build_args=('--build', directory)
 | 
			
		||||
    if target:
 | 
			
		||||
      build_args += ('--target', target)
 | 
			
		||||
    if config:
 | 
			
		||||
      build_args += ('--config', config)
 | 
			
		||||
    if args:
 | 
			
		||||
        build_args += ('--',)
 | 
			
		||||
        build_args += tuple(args)
 | 
			
		||||
    resultcode, lines = shell('cmake', build_args)
 | 
			
		||||
 | 
			
		||||
    if resultcode:
 | 
			
		||||
        print('Build FAILED:')
 | 
			
		||||
        if not ARGS.verbose:
 | 
			
		||||
            print(*lines, sep='')
 | 
			
		||||
        sys.exit(1)
 | 
			
		||||
 | 
			
		||||
def run_cmake_tests(directory, target, config):
 | 
			
		||||
    failed = []
 | 
			
		||||
    if IS_WINDOWS:
 | 
			
		||||
        target += '.exe'
 | 
			
		||||
    executable = os.path.join(directory, config if config else 'Debug', target)
 | 
			
		||||
    if(not os.path.exists(executable)):
 | 
			
		||||
        executable = os.path.join(directory, target)
 | 
			
		||||
    print('Unit tests for', executable)
 | 
			
		||||
    testflag = '--unittest'
 | 
			
		||||
    quiet = ''
 | 
			
		||||
    testjobs = ''
 | 
			
		||||
    ipv6 = ''
 | 
			
		||||
    if ARGS.test:
 | 
			
		||||
        testflag += ('=' + ARGS.test)
 | 
			
		||||
    if ARGS.quiet:
 | 
			
		||||
        quiet = '-q'
 | 
			
		||||
    if ARGS.ipv6:
 | 
			
		||||
        ipv6 = '--unittest-ipv6'
 | 
			
		||||
    if ARGS.testjobs:
 | 
			
		||||
        testjobs = ('--unittest-jobs=' + str(ARGS.testjobs))
 | 
			
		||||
    resultcode, lines = shell(executable, (testflag, quiet, testjobs, ipv6))
 | 
			
		||||
 | 
			
		||||
    if resultcode:
 | 
			
		||||
        if not ARGS.verbose:
 | 
			
		||||
            print('ERROR:', *lines, sep='')
 | 
			
		||||
        failed.append([target, 'unittest'])
 | 
			
		||||
 | 
			
		||||
    return failed
 | 
			
		||||
 | 
			
		||||
def main():
 | 
			
		||||
    all_failed = []
 | 
			
		||||
    if ARGS.all:
 | 
			
		||||
        build_dir_targets = CMAKE_DIR_TARGETS
 | 
			
		||||
        generator_options = CMAKE_ALL_GENERATE_OPTIONS
 | 
			
		||||
    else:
 | 
			
		||||
        build_dir_targets = { tuple(ARGS.dir) : [ARGS.target, ARGS.config] }
 | 
			
		||||
        if ARGS.generator_option:
 | 
			
		||||
            generator_options = [tuple(ARGS.generator_option)]
 | 
			
		||||
        else:
 | 
			
		||||
            generator_options = [tuple()]
 | 
			
		||||
 | 
			
		||||
    if not build_dir_targets:
 | 
			
		||||
        # Let CMake choose the build tool.
 | 
			
		||||
        build_dir_targets = { () : [] }
 | 
			
		||||
 | 
			
		||||
    if ARGS.build_option:
 | 
			
		||||
        ARGS.build_option = ARGS.build_option + list(ARGS.extra_args)
 | 
			
		||||
    else:
 | 
			
		||||
        ARGS.build_option = list(ARGS.extra_args)
 | 
			
		||||
 | 
			
		||||
    for args in generator_options:
 | 
			
		||||
        for build_dirs, (build_targets, build_configs) in build_dir_targets.items():
 | 
			
		||||
            if not build_dirs:
 | 
			
		||||
                build_dirs = ('default',)
 | 
			
		||||
            if not build_targets:
 | 
			
		||||
                build_targets = ('rippled',)
 | 
			
		||||
            if not build_configs:
 | 
			
		||||
                build_configs = ('',)
 | 
			
		||||
            for cmake_dir in build_dirs:
 | 
			
		||||
                cmake_full_dir = get_cmake_dir(cmake_dir)
 | 
			
		||||
                run_cmake(cmake_full_dir, cmake_dir, args)
 | 
			
		||||
 | 
			
		||||
                for target in build_targets:
 | 
			
		||||
                    for config in build_configs:
 | 
			
		||||
                        run_cmake_build(cmake_full_dir, target, config, ARGS.build_option)
 | 
			
		||||
                        failed = run_cmake_tests(cmake_full_dir, target, config)
 | 
			
		||||
 | 
			
		||||
                        if failed:
 | 
			
		||||
                            print('FAILED:', *(':'.join(f) for f in failed))
 | 
			
		||||
                            if not ARGS.keep_going:
 | 
			
		||||
                                sys.exit(1)
 | 
			
		||||
                            else:
 | 
			
		||||
                                all_failed.extend([decodeString(cmake_dir +
 | 
			
		||||
                                        "." + target + "." + config), ':'.join(f)]
 | 
			
		||||
                                    for f in failed)
 | 
			
		||||
                        else:
 | 
			
		||||
                            print('Success')
 | 
			
		||||
                if ARGS.clean:
 | 
			
		||||
                    shutil.rmtree(cmake_full_dir)
 | 
			
		||||
 | 
			
		||||
    if all_failed:
 | 
			
		||||
        if len(all_failed) > 1:
 | 
			
		||||
            print()
 | 
			
		||||
            print('FAILED:', *(':'.join(f) for f in all_failed))
 | 
			
		||||
        sys.exit(1)
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    main()
 | 
			
		||||
    sys.exit(0)
 | 
			
		||||
@@ -1,7 +0,0 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
num_procs=$(lscpu -p | grep -v '^#' | sort -u -t, -k 2,4 | wc -l) # number of physical cores
 | 
			
		||||
 | 
			
		||||
path=$(cd $(dirname $0) && pwd)
 | 
			
		||||
cd $(dirname $path)
 | 
			
		||||
${path}/Test.py -a -c --testjobs=${num_procs} -- -j${num_procs}
 | 
			
		||||
@@ -1,31 +0,0 @@
 | 
			
		||||
 | 
			
		||||
# rippled Packaging and Containers
 | 
			
		||||
 | 
			
		||||
This folder contains docker container definitions and configuration
 | 
			
		||||
files to support building rpm and deb packages of rippled. The container
 | 
			
		||||
definitions include some additional software/packages that are used
 | 
			
		||||
for general build/test CI workflows of rippled but are not explicitly
 | 
			
		||||
needed for the package building workflow.
 | 
			
		||||
 | 
			
		||||
## CMake Targets
 | 
			
		||||
 | 
			
		||||
If you have docker installed on your local system, then the main 
 | 
			
		||||
CMake file will enable several targets related to building packages:
 | 
			
		||||
`rpm_container`, `rpm`, `dpkg_container`, and `dpkg`. The package targets
 | 
			
		||||
depend on the container targets and will trigger a build of those first.
 | 
			
		||||
The container builds can take several dozen minutes to complete (depending
 | 
			
		||||
on hardware specs), so quick build cycles are not possible currently. As
 | 
			
		||||
such, these targets are often best suited to CI/automated build systems.
 | 
			
		||||
 | 
			
		||||
The package build can be invoked like any other cmake target from the 
 | 
			
		||||
rippled root folder:
 | 
			
		||||
```
 | 
			
		||||
mkdir -p build/pkg && cd build/pkg
 | 
			
		||||
cmake -Dpackages_only=ON ../..
 | 
			
		||||
cmake --build . --target rpm
 | 
			
		||||
```
 | 
			
		||||
Upon successful completion, the generated package files will be in 
 | 
			
		||||
the `build/pkg/packages` directory. For deb packages, simply replace
 | 
			
		||||
`rpm` with `dpkg` in the build command above.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -1,26 +0,0 @@
 | 
			
		||||
FROM rippleci/centos:7
 | 
			
		||||
ARG GIT_COMMIT=unknown
 | 
			
		||||
ARG CI_USE=false
 | 
			
		||||
 | 
			
		||||
LABEL git-commit=$GIT_COMMIT
 | 
			
		||||
 | 
			
		||||
COPY centos-builder/centos_setup.sh /tmp/
 | 
			
		||||
COPY shared/install_cmake.sh /tmp/
 | 
			
		||||
RUN chmod +x /tmp/centos_setup.sh && \
 | 
			
		||||
    chmod +x /tmp/install_cmake.sh
 | 
			
		||||
RUN /tmp/centos_setup.sh
 | 
			
		||||
 | 
			
		||||
RUN /tmp/install_cmake.sh 3.16.3 /opt/local/cmake-3.16
 | 
			
		||||
RUN ln -s /opt/local/cmake-3.16 /opt/local/cmake
 | 
			
		||||
ENV PATH="/opt/local/cmake/bin:$PATH"
 | 
			
		||||
# TODO: Install latest CMake for testing
 | 
			
		||||
RUN if [ "${CI_USE}" = true ] ; then /tmp/install_cmake.sh 3.16.3 /opt/local/cmake-3.16; fi
 | 
			
		||||
 | 
			
		||||
RUN mkdir -m 777 -p /opt/rippled_bld/pkg
 | 
			
		||||
 | 
			
		||||
WORKDIR /opt/rippled_bld/pkg
 | 
			
		||||
RUN mkdir -m 777 ./rpmbuild
 | 
			
		||||
RUN mkdir -m 777 ./rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
 | 
			
		||||
 | 
			
		||||
COPY packaging/rpm/build_rpm.sh ./
 | 
			
		||||
CMD ./build_rpm.sh
 | 
			
		||||
@@ -1,22 +0,0 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
set -ex
 | 
			
		||||
 | 
			
		||||
source /etc/os-release
 | 
			
		||||
 | 
			
		||||
yum -y upgrade
 | 
			
		||||
yum -y update
 | 
			
		||||
yum -y install epel-release centos-release-scl
 | 
			
		||||
yum -y install \
 | 
			
		||||
    wget curl time gcc-c++ yum-utils autoconf automake pkgconfig libtool \
 | 
			
		||||
    libstdc++-static rpm-build gnupg which make cmake \
 | 
			
		||||
    devtoolset-11 devtoolset-11-gdb devtoolset-11-binutils devtoolset-11-libstdc++-devel \
 | 
			
		||||
    devtoolset-11-libasan-devel devtoolset-11-libtsan-devel devtoolset-11-libubsan-devel devtoolset-11-liblsan-devel \
 | 
			
		||||
    flex flex-devel bison bison-devel parallel \
 | 
			
		||||
    ncurses ncurses-devel ncurses-libs graphviz graphviz-devel \
 | 
			
		||||
    lzip p7zip bzip2 bzip2-devel lzma-sdk lzma-sdk-devel xz-devel \
 | 
			
		||||
    zlib zlib-devel zlib-static texinfo openssl openssl-static \
 | 
			
		||||
    jemalloc jemalloc-devel \
 | 
			
		||||
    libicu-devel htop \
 | 
			
		||||
    rh-python38 \
 | 
			
		||||
    ninja-build git svn \
 | 
			
		||||
    swig perl-Digest-MD5
 | 
			
		||||
@@ -1,28 +0,0 @@
 | 
			
		||||
#!/usr/bin/env sh
 | 
			
		||||
set -ex
 | 
			
		||||
pkgtype=$1
 | 
			
		||||
if [ "${pkgtype}" = "rpm" ] ; then
 | 
			
		||||
    container_name="${RPM_CONTAINER_NAME}"
 | 
			
		||||
elif [ "${pkgtype}" = "dpkg" ] ; then
 | 
			
		||||
    container_name="${DPKG_CONTAINER_NAME}"
 | 
			
		||||
else
 | 
			
		||||
    echo "invalid package type"
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if docker pull "${ARTIFACTORY_HUB}/${container_name}:latest_${CI_COMMIT_REF_SLUG}"; then
 | 
			
		||||
    echo "found container for latest - using as cache."
 | 
			
		||||
    docker tag \
 | 
			
		||||
       "${ARTIFACTORY_HUB}/${container_name}:latest_${CI_COMMIT_REF_SLUG}" \
 | 
			
		||||
       "${container_name}:latest_${CI_COMMIT_REF_SLUG}"
 | 
			
		||||
    CMAKE_EXTRA="-D${pkgtype}_cache_from=${container_name}:latest_${CI_COMMIT_REF_SLUG}"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
cmake --version
 | 
			
		||||
test -d build && rm -rf build
 | 
			
		||||
mkdir -p build/container && cd build/container
 | 
			
		||||
eval time \
 | 
			
		||||
    cmake -Dpackages_only=ON -DCMAKE_VERBOSE_MAKEFILE=ON ${CMAKE_EXTRA} \
 | 
			
		||||
    -G Ninja ../..
 | 
			
		||||
time cmake --build . --target "${pkgtype}_container" -- -v
 | 
			
		||||
 | 
			
		||||
@@ -1,28 +0,0 @@
 | 
			
		||||
#!/usr/bin/env sh
 | 
			
		||||
set -ex
 | 
			
		||||
pkgtype=$1
 | 
			
		||||
if [ "${pkgtype}" = "rpm" ] ; then
 | 
			
		||||
    container_name="${RPM_CONTAINER_FULLNAME}"
 | 
			
		||||
    container_tag="${RPM_CONTAINER_TAG}"
 | 
			
		||||
elif [ "${pkgtype}" = "dpkg" ] ; then
 | 
			
		||||
    container_name="${DPKG_CONTAINER_FULLNAME}"
 | 
			
		||||
    container_tag="${DPKG_CONTAINER_TAG}"
 | 
			
		||||
else
 | 
			
		||||
    echo "invalid package type"
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
time docker pull "${ARTIFACTORY_HUB}/${container_name}"
 | 
			
		||||
docker tag \
 | 
			
		||||
  "${ARTIFACTORY_HUB}/${container_name}" \
 | 
			
		||||
  "${container_name}"
 | 
			
		||||
docker images
 | 
			
		||||
test -d build && rm -rf build
 | 
			
		||||
mkdir -p build/${pkgtype} && cd build/${pkgtype}
 | 
			
		||||
time cmake \
 | 
			
		||||
  -Dpackages_only=ON \
 | 
			
		||||
  -Dcontainer_label="${container_tag}" \
 | 
			
		||||
  -Dhave_package_container=ON \
 | 
			
		||||
  -DCMAKE_VERBOSE_MAKEFILE=ON \
 | 
			
		||||
  -Dunity=OFF \
 | 
			
		||||
  -G Ninja ../..
 | 
			
		||||
time cmake --build . --target ${pkgtype} -- -v
 | 
			
		||||
@@ -1,15 +0,0 @@
 | 
			
		||||
#!/usr/bin/env sh
 | 
			
		||||
set -e
 | 
			
		||||
# used as a before/setup script for docker steps in gitlab-ci
 | 
			
		||||
# expects to be run in standard alpine/dind image
 | 
			
		||||
echo $(nproc)
 | 
			
		||||
docker login -u rippled \
 | 
			
		||||
    -p ${ARTIFACTORY_DEPLOY_KEY_RIPPLED} ${ARTIFACTORY_HUB}
 | 
			
		||||
apk add --update py-pip
 | 
			
		||||
apk add \
 | 
			
		||||
    bash util-linux coreutils binutils grep \
 | 
			
		||||
    make ninja cmake build-base gcc g++ abuild git \
 | 
			
		||||
    python3 python3-dev
 | 
			
		||||
pip3 install awscli --break-system-packages
 | 
			
		||||
# list curdir contents to build log:
 | 
			
		||||
ls -la
 | 
			
		||||
@@ -1,16 +0,0 @@
 | 
			
		||||
#!/usr/bin/env sh
 | 
			
		||||
case ${CI_COMMIT_REF_NAME} in
 | 
			
		||||
    develop)
 | 
			
		||||
        export COMPONENT="nightly"
 | 
			
		||||
        ;;
 | 
			
		||||
    release)
 | 
			
		||||
        export COMPONENT="unstable"
 | 
			
		||||
        ;;
 | 
			
		||||
    master)
 | 
			
		||||
        export COMPONENT="stable"
 | 
			
		||||
        ;;
 | 
			
		||||
    *)
 | 
			
		||||
        export COMPONENT="_unknown_"
 | 
			
		||||
        ;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
@@ -1,771 +0,0 @@
 | 
			
		||||
#########################################################################
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
##  gitlab CI defintition for rippled build containers and distro      ##
 | 
			
		||||
##  packages (rpm and dpkg).                                           ##
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
#########################################################################
 | 
			
		||||
 | 
			
		||||
# NOTE: these are sensible defaults for Ripple pipelines. These
 | 
			
		||||
# can be overridden by project or group variables as needed.
 | 
			
		||||
variables:
 | 
			
		||||
  # these containers are built manually using the rippled
 | 
			
		||||
  # cmake build (container targets) and tagged/pushed so they
 | 
			
		||||
  # can be used here
 | 
			
		||||
  RPM_CONTAINER_TAG: "2023-02-13"
 | 
			
		||||
  RPM_CONTAINER_NAME: "rippled-rpm-builder"
 | 
			
		||||
  RPM_CONTAINER_FULLNAME: "${RPM_CONTAINER_NAME}:${RPM_CONTAINER_TAG}"
 | 
			
		||||
  DPKG_CONTAINER_TAG: "2023-07-31"
 | 
			
		||||
  DPKG_CONTAINER_NAME: "rippled-dpkg-builder"
 | 
			
		||||
  DPKG_CONTAINER_FULLNAME: "${DPKG_CONTAINER_NAME}:${DPKG_CONTAINER_TAG}"
 | 
			
		||||
  ARTIFACTORY_HOST: "artifactory.ops.ripple.com"
 | 
			
		||||
  ARTIFACTORY_HUB: "${ARTIFACTORY_HOST}:6555"
 | 
			
		||||
  GIT_SIGN_PUBKEYS_URL: "https://gitlab.ops.ripple.com/xrpledger/rippled-packages/snippets/49/raw"
 | 
			
		||||
  PUBLIC_REPO_ROOT: "https://repos.ripple.com/repos"
 | 
			
		||||
  # also need to define this variable ONLY for the primary
 | 
			
		||||
  # build/publish pipeline on the mainline repo:
 | 
			
		||||
  #   IS_PRIMARY_REPO = "true"
 | 
			
		||||
 | 
			
		||||
stages:
 | 
			
		||||
  - build_packages
 | 
			
		||||
  - sign_packages
 | 
			
		||||
  - smoketest
 | 
			
		||||
  - verify_sig
 | 
			
		||||
  - tag_images
 | 
			
		||||
  - push_to_test
 | 
			
		||||
  - verify_from_test
 | 
			
		||||
  - wait_approval_prod
 | 
			
		||||
  - push_to_prod
 | 
			
		||||
  - verify_from_prod
 | 
			
		||||
  - get_final_hashes
 | 
			
		||||
  - build_containers
 | 
			
		||||
 | 
			
		||||
.dind_template: &dind_param
 | 
			
		||||
  before_script:
 | 
			
		||||
    - . ./Builds/containers/gitlab-ci/docker_alpine_setup.sh
 | 
			
		||||
  variables:
 | 
			
		||||
    docker_driver: overlay2
 | 
			
		||||
    DOCKER_TLS_CERTDIR: ""
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/docker:latest
 | 
			
		||||
  services:
 | 
			
		||||
    # workaround for TLS issues - consider going back
 | 
			
		||||
    # back to unversioned `dind` when issues are resolved
 | 
			
		||||
    - name: artifactory.ops.ripple.com/docker:stable-dind
 | 
			
		||||
      alias: docker
 | 
			
		||||
  tags:
 | 
			
		||||
    - 4xlarge
 | 
			
		||||
 | 
			
		||||
.only_primary_template: &only_primary
 | 
			
		||||
  only:
 | 
			
		||||
    refs:
 | 
			
		||||
      - /^(master|release|develop)$/
 | 
			
		||||
    variables:
 | 
			
		||||
      - $IS_PRIMARY_REPO == "true"
 | 
			
		||||
 | 
			
		||||
.smoketest_local_template: &run_local_smoketest
 | 
			
		||||
  tags:
 | 
			
		||||
    - xlarge
 | 
			
		||||
  script:
 | 
			
		||||
    - . ./Builds/containers/gitlab-ci/smoketest.sh local
 | 
			
		||||
 | 
			
		||||
.smoketest_repo_template: &run_repo_smoketest
 | 
			
		||||
  tags:
 | 
			
		||||
    - xlarge
 | 
			
		||||
  script:
 | 
			
		||||
    - . ./Builds/containers/gitlab-ci/smoketest.sh repo
 | 
			
		||||
 | 
			
		||||
#########################################################################
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
##  stage: build_packages                                              ##
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
##  build packages using containers from previous stage.               ##
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
#########################################################################
 | 
			
		||||
 | 
			
		||||
rpm_build:
 | 
			
		||||
  timeout: "1h 30m"
 | 
			
		||||
  stage: build_packages
 | 
			
		||||
  <<: *dind_param
 | 
			
		||||
  artifacts:
 | 
			
		||||
    paths:
 | 
			
		||||
      - build/rpm/packages/
 | 
			
		||||
  script:
 | 
			
		||||
    - . ./Builds/containers/gitlab-ci/build_package.sh rpm
 | 
			
		||||
 | 
			
		||||
dpkg_build:
 | 
			
		||||
  timeout: "1h 30m"
 | 
			
		||||
  stage: build_packages
 | 
			
		||||
  <<: *dind_param
 | 
			
		||||
  artifacts:
 | 
			
		||||
    paths:
 | 
			
		||||
      - build/dpkg/packages/
 | 
			
		||||
  script:
 | 
			
		||||
    - . ./Builds/containers/gitlab-ci/build_package.sh dpkg
 | 
			
		||||
 | 
			
		||||
#########################################################################
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
##  stage: sign_packages                                               ##
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
##  build packages using containers from previous stage.               ##
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
#########################################################################
 | 
			
		||||
 | 
			
		||||
rpm_sign:
 | 
			
		||||
  stage: sign_packages
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - rpm_build
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/centos:7
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  before_script:
 | 
			
		||||
  - |
 | 
			
		||||
    # Make sure GnuPG is installed
 | 
			
		||||
    yum -y install gnupg rpm-sign
 | 
			
		||||
    # checking GPG signing support
 | 
			
		||||
    if [ -n "$GPG_KEY_B64" ]; then
 | 
			
		||||
      echo "$GPG_KEY_B64"| base64 -d | gpg --batch --no-tty --allow-secret-key-import --import -
 | 
			
		||||
      unset GPG_KEY_B64
 | 
			
		||||
      export GPG_PASSPHRASE=$(echo $GPG_KEY_PASS_B64 | base64 -di)
 | 
			
		||||
      unset GPG_KEY_PASS_B64
 | 
			
		||||
      export GPG_KEYID=$(gpg --with-colon --list-secret-keys | head -n1 | cut -d : -f 5)
 | 
			
		||||
    else
 | 
			
		||||
      echo -e "\033[0;31m****** GPG signing disabled ******\033[0m"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
  artifacts:
 | 
			
		||||
    paths:
 | 
			
		||||
      - build/rpm/packages/
 | 
			
		||||
  script:
 | 
			
		||||
    - ls -alh build/rpm/packages
 | 
			
		||||
    - . ./Builds/containers/gitlab-ci/sign_package.sh rpm
 | 
			
		||||
 | 
			
		||||
dpkg_sign:
 | 
			
		||||
  stage: sign_packages
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - dpkg_build
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/ubuntu:18.04
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  before_script:
 | 
			
		||||
  - |
 | 
			
		||||
    # make sure we have GnuPG
 | 
			
		||||
    apt update
 | 
			
		||||
    apt install -y gpg dpkg-sig
 | 
			
		||||
    # checking GPG signing support
 | 
			
		||||
    if [ -n "$GPG_KEY_B64" ]; then
 | 
			
		||||
      echo "$GPG_KEY_B64"| base64 -d | gpg --batch --no-tty --allow-secret-key-import --import -
 | 
			
		||||
      unset GPG_KEY_B64
 | 
			
		||||
      export GPG_PASSPHRASE=$(echo $GPG_KEY_PASS_B64 | base64 -di)
 | 
			
		||||
      unset GPG_KEY_PASS_B64
 | 
			
		||||
      export GPG_KEYID=$(gpg --with-colon --list-secret-keys | head -n1 | cut -d : -f 5)
 | 
			
		||||
    else
 | 
			
		||||
      echo -e "\033[0;31m****** GPG signing disabled ******\033[0m"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
  artifacts:
 | 
			
		||||
    paths:
 | 
			
		||||
      - build/dpkg/packages/
 | 
			
		||||
  script:
 | 
			
		||||
    - ls -alh build/dpkg/packages
 | 
			
		||||
    - . ./Builds/containers/gitlab-ci/sign_package.sh dpkg
 | 
			
		||||
 | 
			
		||||
#########################################################################
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
##  stage: smoketest                                                   ##
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
##  install unsigned packages from previous step and run unit tests.   ##
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
#########################################################################
 | 
			
		||||
 | 
			
		||||
centos_7_smoketest:
 | 
			
		||||
  stage: smoketest
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - rpm_build
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/centos:7
 | 
			
		||||
  <<: *run_local_smoketest
 | 
			
		||||
 | 
			
		||||
rocky_8_smoketest:
 | 
			
		||||
  stage: smoketest
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - rpm_build
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/rockylinux/rockylinux:8
 | 
			
		||||
  <<: *run_local_smoketest
 | 
			
		||||
 | 
			
		||||
rocky_9_smoketest:
 | 
			
		||||
  stage: smoketest
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - rpm_build
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/rockylinux/rockylinux:9
 | 
			
		||||
 | 
			
		||||
  <<: *run_local_smoketest
 | 
			
		||||
 | 
			
		||||
alma_8_smoketest:
 | 
			
		||||
  stage: smoketest
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - rpm_build
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/almalinux:8
 | 
			
		||||
  <<: *run_local_smoketest
 | 
			
		||||
 | 
			
		||||
alma_9_smoketest:
 | 
			
		||||
  stage: smoketest
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - rpm_build
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/almalinux:9
 | 
			
		||||
 | 
			
		||||
  <<: *run_local_smoketest
 | 
			
		||||
 | 
			
		||||
fedora_38_smoketest:
 | 
			
		||||
  stage: smoketest
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - rpm_build
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/fedora:38
 | 
			
		||||
  <<: *run_local_smoketest
 | 
			
		||||
 | 
			
		||||
fedora_39_smoketest:
 | 
			
		||||
  stage: smoketest
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - rpm_build
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/fedora:39
 | 
			
		||||
  <<: *run_local_smoketest
 | 
			
		||||
 | 
			
		||||
ubuntu_18_smoketest:
 | 
			
		||||
  stage: smoketest
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - dpkg_build
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/ubuntu:18.04
 | 
			
		||||
  <<: *run_local_smoketest
 | 
			
		||||
 | 
			
		||||
ubuntu_20_smoketest:
 | 
			
		||||
  stage: smoketest
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - dpkg_build
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/ubuntu:20.04
 | 
			
		||||
  <<: *run_local_smoketest
 | 
			
		||||
 | 
			
		||||
ubuntu_22_smoketest:
 | 
			
		||||
  stage: smoketest
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - dpkg_build
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/ubuntu:22.04
 | 
			
		||||
  <<: *run_local_smoketest
 | 
			
		||||
 | 
			
		||||
debian_10_smoketest:
 | 
			
		||||
  stage: smoketest
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - dpkg_build
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/debian:10
 | 
			
		||||
  <<: *run_local_smoketest
 | 
			
		||||
 | 
			
		||||
debian_11_smoketest:
 | 
			
		||||
  stage: smoketest
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - dpkg_build
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/debian:11
 | 
			
		||||
  <<: *run_local_smoketest
 | 
			
		||||
 | 
			
		||||
debian_12_smoketest:
 | 
			
		||||
  stage: smoketest
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - dpkg_build
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/debian:12
 | 
			
		||||
  <<: *run_local_smoketest
 | 
			
		||||
 | 
			
		||||
#########################################################################
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
##  stage: verify_sig                                                  ##
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
##  use git/gpg to verify that HEAD is signed by an approved           ##
 | 
			
		||||
##  committer. The whitelist of pubkeys is manually mantained          ##
 | 
			
		||||
##  and fetched from GIT_SIGN_PUBKEYS_URL (currently a snippet         ##
 | 
			
		||||
##  link).                                                             ##
 | 
			
		||||
##  ONLY RUNS FOR PRIMARY BRANCHES/REPO                                ##
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
#########################################################################
 | 
			
		||||
 | 
			
		||||
verify_head_signed:
 | 
			
		||||
  stage: verify_sig
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/ubuntu:latest
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  script:
 | 
			
		||||
    - . ./Builds/containers/gitlab-ci/verify_head_commit.sh
 | 
			
		||||
 | 
			
		||||
#########################################################################
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
##  stage: tag_images                                                  ##
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
##  apply rippled version tag to containers from previous stage.       ##
 | 
			
		||||
##  ONLY RUNS FOR PRIMARY BRANCHES/REPO                                ##
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
#########################################################################
 | 
			
		||||
 | 
			
		||||
tag_bld_images:
 | 
			
		||||
  stage: tag_images
 | 
			
		||||
  variables:
 | 
			
		||||
    docker_driver: overlay2
 | 
			
		||||
    DOCKER_TLS_CERTDIR: ""
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/docker:latest
 | 
			
		||||
  services:
 | 
			
		||||
    # workaround for TLS issues - consider going back
 | 
			
		||||
    # back to unversioned `dind` when issues are resolved
 | 
			
		||||
    - name: artifactory.ops.ripple.com/docker:stable-dind
 | 
			
		||||
      alias: docker
 | 
			
		||||
  tags:
 | 
			
		||||
    - large
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - rpm_sign
 | 
			
		||||
    - dpkg_sign
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  script:
 | 
			
		||||
    - . ./Builds/containers/gitlab-ci/tag_docker_image.sh
 | 
			
		||||
 | 
			
		||||
#########################################################################
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
##  stage: push_to_test                                                ##
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
##  push packages to artifactory repositories (test)                   ##
 | 
			
		||||
##  ONLY RUNS FOR PRIMARY BRANCHES/REPO                                ##
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
#########################################################################
 | 
			
		||||
 | 
			
		||||
push_test:
 | 
			
		||||
  stage: push_to_test
 | 
			
		||||
  variables:
 | 
			
		||||
    DEB_REPO: "rippled-deb-test-mirror"
 | 
			
		||||
    RPM_REPO: "rippled-rpm-test-mirror"
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/alpine:latest
 | 
			
		||||
  artifacts:
 | 
			
		||||
    paths:
 | 
			
		||||
      - files.info
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - rpm_sign
 | 
			
		||||
    - dpkg_sign
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  script:
 | 
			
		||||
    - . ./Builds/containers/gitlab-ci/push_to_artifactory.sh "PUT" "."
 | 
			
		||||
 | 
			
		||||
#########################################################################
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
##  stage: verify_from_test                                            ##
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
##  install/test packages from test repos.                             ##
 | 
			
		||||
##  ONLY RUNS FOR PRIMARY BRANCHES/REPO                                ##
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
#########################################################################
 | 
			
		||||
 | 
			
		||||
centos_7_verify_repo_test:
 | 
			
		||||
  stage: verify_from_test
 | 
			
		||||
  variables:
 | 
			
		||||
    RPM_REPO: "rippled-rpm-test-mirror"
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/centos:7
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - rpm_sign
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  <<: *run_repo_smoketest
 | 
			
		||||
 | 
			
		||||
rocky_8_verify_repo_test:
 | 
			
		||||
  stage: verify_from_test
 | 
			
		||||
  variables:
 | 
			
		||||
    RPM_REPO: "rippled-rpm-test-mirror"
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/rockylinux/rockylinux:8
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - rpm_sign
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  <<: *run_repo_smoketest
 | 
			
		||||
 | 
			
		||||
rocky_9_verify_repo_test:
 | 
			
		||||
  stage: verify_from_test
 | 
			
		||||
  variables:
 | 
			
		||||
    RPM_REPO: "rippled-rpm-test-mirror"
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/rockylinux/rockylinux:9
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - rpm_sign
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  <<: *run_repo_smoketest
 | 
			
		||||
 | 
			
		||||
almalinux_8_verify_repo_test:
 | 
			
		||||
  stage: verify_from_test
 | 
			
		||||
  variables:
 | 
			
		||||
    RPM_REPO: "rippled-rpm-test-mirror"
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/almalinux:8
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - rpm_sign
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  <<: *run_repo_smoketest
 | 
			
		||||
 | 
			
		||||
almalinux_9_verify_repo_test:
 | 
			
		||||
  stage: verify_from_test
 | 
			
		||||
  variables:
 | 
			
		||||
    RPM_REPO: "rippled-rpm-test-mirror"
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/almalinux:9
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - rpm_sign
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  <<: *run_repo_smoketest
 | 
			
		||||
 | 
			
		||||
fedora_38_verify_repo_test:
 | 
			
		||||
  stage: verify_from_test
 | 
			
		||||
  variables:
 | 
			
		||||
    RPM_REPO: "rippled-rpm-test-mirror"
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/fedora:38
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - rpm_sign
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  <<: *run_repo_smoketest
 | 
			
		||||
 | 
			
		||||
fedora_39_verify_repo_test:
 | 
			
		||||
  stage: verify_from_test
 | 
			
		||||
  variables:
 | 
			
		||||
    RPM_REPO: "rippled-rpm-test-mirror"
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/fedora:39
 | 
			
		||||
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - rpm_sign
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  <<: *run_repo_smoketest
 | 
			
		||||
 | 
			
		||||
ubuntu_18_verify_repo_test:
 | 
			
		||||
  stage: verify_from_test
 | 
			
		||||
  variables:
 | 
			
		||||
    DISTRO: "bionic"
 | 
			
		||||
    DEB_REPO: "rippled-deb-test-mirror"
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/ubuntu:18.04
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - dpkg_sign
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  <<: *run_repo_smoketest
 | 
			
		||||
 | 
			
		||||
ubuntu_20_verify_repo_test:
 | 
			
		||||
  stage: verify_from_test
 | 
			
		||||
  variables:
 | 
			
		||||
    DISTRO: "focal"
 | 
			
		||||
    DEB_REPO: "rippled-deb-test-mirror"
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/ubuntu:20.04
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - dpkg_sign
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  <<: *run_repo_smoketest
 | 
			
		||||
 | 
			
		||||
ubuntu_22_verify_repo_test:
 | 
			
		||||
  stage: verify_from_test
 | 
			
		||||
  variables:
 | 
			
		||||
    DISTRO: "jammy"
 | 
			
		||||
    DEB_REPO: "rippled-deb-test-mirror"
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/ubuntu:22.04
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - dpkg_sign
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  <<: *run_repo_smoketest
 | 
			
		||||
 | 
			
		||||
debian_10_verify_repo_test:
 | 
			
		||||
  stage: verify_from_test
 | 
			
		||||
  variables:
 | 
			
		||||
    DISTRO: "buster"
 | 
			
		||||
    DEB_REPO: "rippled-deb-test-mirror"
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/debian:10
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - dpkg_sign
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  <<: *run_repo_smoketest
 | 
			
		||||
 | 
			
		||||
debian_11_verify_repo_test:
 | 
			
		||||
  stage: verify_from_test
 | 
			
		||||
  variables:
 | 
			
		||||
    DISTRO: "bullseye"
 | 
			
		||||
    DEB_REPO: "rippled-deb-test-mirror"
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/debian:11
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - dpkg_sign
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  <<: *run_repo_smoketest
 | 
			
		||||
 | 
			
		||||
debian_12_verify_repo_test:
 | 
			
		||||
  stage: verify_from_test
 | 
			
		||||
  variables:
 | 
			
		||||
    DISTRO: "bookworm"
 | 
			
		||||
    DEB_REPO: "rippled-deb-test-mirror"
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/debian:12
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - dpkg_sign
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  <<: *run_repo_smoketest
 | 
			
		||||
 | 
			
		||||
#########################################################################
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
##  stage: wait_approval_prod                                          ##
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
##  wait for manual approval before proceeding to next stage           ##
 | 
			
		||||
##  which pushes to prod repo.                                         ##
 | 
			
		||||
##  ONLY RUNS FOR PRIMARY BRANCHES/REPO                                ##
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
#########################################################################
 | 
			
		||||
wait_before_push_prod:
 | 
			
		||||
  stage: wait_approval_prod
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/alpine:latest
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  script:
 | 
			
		||||
    - echo "proceeding to next stage"
 | 
			
		||||
  when: manual
 | 
			
		||||
  allow_failure: false
 | 
			
		||||
 | 
			
		||||
#########################################################################
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
##  stage: push_to_prod                                                ##
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
##  push packages to artifactory repositories (prod)                   ##
 | 
			
		||||
##  ONLY RUNS FOR PRIMARY BRANCHES/REPO                                ##
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
#########################################################################
 | 
			
		||||
 | 
			
		||||
push_prod:
 | 
			
		||||
  variables:
 | 
			
		||||
    DEB_REPO: "rippled-deb"
 | 
			
		||||
    RPM_REPO: "rippled-rpm"
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/alpine:latest
 | 
			
		||||
  stage: push_to_prod
 | 
			
		||||
  artifacts:
 | 
			
		||||
    paths:
 | 
			
		||||
      - files.info
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - rpm_sign
 | 
			
		||||
    - dpkg_sign
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  script:
 | 
			
		||||
    - . ./Builds/containers/gitlab-ci/push_to_artifactory.sh "PUT" "."
 | 
			
		||||
 | 
			
		||||
#########################################################################
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
##  stage: verify_from_prod                                            ##
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
##  install/test packages from prod repos.                             ##
 | 
			
		||||
##  ONLY RUNS FOR PRIMARY BRANCHES/REPO                                ##
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
#########################################################################
 | 
			
		||||
 | 
			
		||||
centos_7_verify_repo_prod:
 | 
			
		||||
  stage: verify_from_prod
 | 
			
		||||
  variables:
 | 
			
		||||
    RPM_REPO: "rippled-rpm"
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/centos:7
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - rpm_sign
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  <<: *run_repo_smoketest
 | 
			
		||||
 | 
			
		||||
rocky_8_verify_repo_prod:
 | 
			
		||||
  stage: verify_from_prod
 | 
			
		||||
  variables:
 | 
			
		||||
    RPM_REPO: "rippled-rpm"
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/rockylinux/rockylinux:8
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - rpm_sign
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  <<: *run_repo_smoketest
 | 
			
		||||
 | 
			
		||||
rocky_9_verify_repo_prod:
 | 
			
		||||
  stage: verify_from_prod
 | 
			
		||||
  variables:
 | 
			
		||||
    RPM_REPO: "rippled-rpm"
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/rockylinux/rockylinux:9
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - rpm_sign
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  <<: *run_repo_smoketest
 | 
			
		||||
 | 
			
		||||
alma_8_verify_repo_prod:
 | 
			
		||||
  stage: verify_from_prod
 | 
			
		||||
  variables:
 | 
			
		||||
    RPM_REPO: "rippled-rpm"
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/almalinux:8
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - rpm_sign
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  <<: *run_repo_smoketest
 | 
			
		||||
 | 
			
		||||
alma_9_verify_repo_prod:
 | 
			
		||||
  stage: verify_from_prod
 | 
			
		||||
  variables:
 | 
			
		||||
    RPM_REPO: "rippled-rpm"
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/almalinux:9
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - rpm_sign
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  <<: *run_repo_smoketest
 | 
			
		||||
 | 
			
		||||
fedora_37_verify_repo_prod:
 | 
			
		||||
  stage: verify_from_prod
 | 
			
		||||
  variables:
 | 
			
		||||
    RPM_REPO: "rippled-rpm"
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/fedora:37
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - rpm_sign
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  <<: *run_repo_smoketest
 | 
			
		||||
 | 
			
		||||
fedora_38_verify_repo_prod:
 | 
			
		||||
  stage: verify_from_prod
 | 
			
		||||
  variables:
 | 
			
		||||
    RPM_REPO: "rippled-rpm"
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/fedora:38
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - rpm_sign
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  <<: *run_repo_smoketest
 | 
			
		||||
 | 
			
		||||
ubuntu_18_verify_repo_prod:
 | 
			
		||||
  stage: verify_from_prod
 | 
			
		||||
  variables:
 | 
			
		||||
    DISTRO: "bionic"
 | 
			
		||||
    DEB_REPO: "rippled-deb"
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/ubuntu:18.04
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - dpkg_sign
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  <<: *run_repo_smoketest
 | 
			
		||||
 | 
			
		||||
ubuntu_20_verify_repo_prod:
 | 
			
		||||
  stage: verify_from_prod
 | 
			
		||||
  variables:
 | 
			
		||||
    DISTRO: "focal"
 | 
			
		||||
    DEB_REPO: "rippled-deb"
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/ubuntu:20.04
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - dpkg_sign
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  <<: *run_repo_smoketest
 | 
			
		||||
 | 
			
		||||
ubuntu_22_verify_repo_prod:
 | 
			
		||||
  stage: verify_from_prod
 | 
			
		||||
  variables:
 | 
			
		||||
    DISTRO: "jammy"
 | 
			
		||||
    DEB_REPO: "rippled-deb"
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/ubuntu:22.04
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - dpkg_sign
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  <<: *run_repo_smoketest
 | 
			
		||||
 | 
			
		||||
debian_10_verify_repo_prod:
 | 
			
		||||
  stage: verify_from_prod
 | 
			
		||||
  variables:
 | 
			
		||||
    DISTRO: "buster"
 | 
			
		||||
    DEB_REPO: "rippled-deb"
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/debian:10
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - dpkg_sign
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  <<: *run_repo_smoketest
 | 
			
		||||
 | 
			
		||||
debian_11_verify_repo_prod:
 | 
			
		||||
  stage: verify_from_prod
 | 
			
		||||
  variables:
 | 
			
		||||
    DISTRO: "bullseye"
 | 
			
		||||
    DEB_REPO: "rippled-deb"
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/debian:11
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - dpkg_sign
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  <<: *run_repo_smoketest
 | 
			
		||||
 | 
			
		||||
debian_12_verify_repo_prod:
 | 
			
		||||
  stage: verify_from_prod
 | 
			
		||||
  variables:
 | 
			
		||||
    DISTRO: "bookworm"
 | 
			
		||||
    DEB_REPO: "rippled-deb"
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/debian:12
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - dpkg_sign
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  <<: *run_repo_smoketest
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#########################################################################
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
##  stage: get_final_hashes                                            ##
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
##  fetch final hashes from artifactory.                               ##
 | 
			
		||||
##  ONLY RUNS FOR PRIMARY BRANCHES/REPO                                ##
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
#########################################################################
 | 
			
		||||
 | 
			
		||||
get_prod_hashes:
 | 
			
		||||
  variables:
 | 
			
		||||
    DEB_REPO: "rippled-deb"
 | 
			
		||||
    RPM_REPO: "rippled-rpm"
 | 
			
		||||
  image:
 | 
			
		||||
    name: artifactory.ops.ripple.com/alpine:latest
 | 
			
		||||
  stage: get_final_hashes
 | 
			
		||||
  artifacts:
 | 
			
		||||
    paths:
 | 
			
		||||
      - files.info
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - rpm_sign
 | 
			
		||||
    - dpkg_sign
 | 
			
		||||
  <<: *only_primary
 | 
			
		||||
  script:
 | 
			
		||||
    - . ./Builds/containers/gitlab-ci/push_to_artifactory.sh "GET" ".checksums"
 | 
			
		||||
 | 
			
		||||
#########################################################################
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
##  stage: build_containers                                            ##
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
##  build containers from docker definitions. These containers are NOT ##
 | 
			
		||||
##  used for the package build. This step is only used to ensure that  ##
 | 
			
		||||
##  the package build targets and files are still working properly.    ##
 | 
			
		||||
##                                                                     ##
 | 
			
		||||
#########################################################################
 | 
			
		||||
 | 
			
		||||
build_centos_container:
 | 
			
		||||
  stage: build_containers
 | 
			
		||||
  <<: *dind_param
 | 
			
		||||
  script:
 | 
			
		||||
    - . ./Builds/containers/gitlab-ci/build_container.sh rpm
 | 
			
		||||
 | 
			
		||||
build_ubuntu_container:
 | 
			
		||||
  stage: build_containers
 | 
			
		||||
  <<: *dind_param
 | 
			
		||||
  script:
 | 
			
		||||
    - . ./Builds/containers/gitlab-ci/build_container.sh dpkg
 | 
			
		||||
@@ -1,92 +0,0 @@
 | 
			
		||||
#!/usr/bin/env sh
 | 
			
		||||
set -e
 | 
			
		||||
action=$1
 | 
			
		||||
filter=$2
 | 
			
		||||
 | 
			
		||||
. ./Builds/containers/gitlab-ci/get_component.sh
 | 
			
		||||
 | 
			
		||||
apk add curl jq coreutils util-linux
 | 
			
		||||
TOPDIR=$(pwd)
 | 
			
		||||
 | 
			
		||||
# DPKG
 | 
			
		||||
 | 
			
		||||
cd $TOPDIR
 | 
			
		||||
cd build/dpkg/packages
 | 
			
		||||
CURLARGS="-sk -X${action} -urippled:${ARTIFACTORY_DEPLOY_KEY_RIPPLED}"
 | 
			
		||||
RIPPLED_PKG=$(ls rippled_*.deb)
 | 
			
		||||
RIPPLED_REPORTING_PKG=$(ls rippled-reporting_*.deb)
 | 
			
		||||
RIPPLED_DBG_PKG=$(ls rippled-dbgsym_*.*deb)
 | 
			
		||||
RIPPLED_REPORTING_DBG_PKG=$(ls rippled-reporting-dbgsym_*.*deb)
 | 
			
		||||
# TODO - where to upload src tgz?
 | 
			
		||||
RIPPLED_SRC=$(ls rippled_*.orig.tar.gz)
 | 
			
		||||
DEB_MATRIX=";deb.component=${COMPONENT};deb.architecture=amd64"
 | 
			
		||||
for dist in bookworm buster bullseye bionic focal jammy; do
 | 
			
		||||
    DEB_MATRIX="${DEB_MATRIX};deb.distribution=${dist}"
 | 
			
		||||
done
 | 
			
		||||
echo "{ \"debs\": {" > "${TOPDIR}/files.info"
 | 
			
		||||
for deb in ${RIPPLED_PKG} ${RIPPLED_DBG_PKG} ${RIPPLED_REPORTING_PKG} ${RIPPLED_REPORTING_DBG_PKG}; do
 | 
			
		||||
    # first item doesn't get a comma separator
 | 
			
		||||
    if [ $deb != $RIPPLED_PKG ] ; then
 | 
			
		||||
        echo "," >> "${TOPDIR}/files.info"
 | 
			
		||||
    fi
 | 
			
		||||
    echo "\"${deb}\"": | tee -a "${TOPDIR}/files.info"
 | 
			
		||||
    ca="${CURLARGS}"
 | 
			
		||||
    if [ "${action}" = "PUT" ] ; then
 | 
			
		||||
        url="https://${ARTIFACTORY_HOST}/artifactory/${DEB_REPO}/pool/${COMPONENT}/${deb}${DEB_MATRIX}"
 | 
			
		||||
        ca="${ca} -T${deb}"
 | 
			
		||||
    elif [ "${action}" = "GET" ] ; then
 | 
			
		||||
        url="https://${ARTIFACTORY_HOST}/artifactory/api/storage/${DEB_REPO}/pool/${COMPONENT}/${deb}"
 | 
			
		||||
    fi
 | 
			
		||||
    echo "file info request url --> ${url}"
 | 
			
		||||
    eval "curl ${ca} \"${url}\"" | jq -M "${filter}" | tee -a "${TOPDIR}/files.info"
 | 
			
		||||
done
 | 
			
		||||
echo "}," >> "${TOPDIR}/files.info"
 | 
			
		||||
 | 
			
		||||
# RPM
 | 
			
		||||
 | 
			
		||||
cd $TOPDIR
 | 
			
		||||
cd build/rpm/packages
 | 
			
		||||
RIPPLED_PKG=$(ls rippled-[0-9]*.x86_64.rpm)
 | 
			
		||||
RIPPLED_DEV_PKG=$(ls rippled-devel*.rpm)
 | 
			
		||||
RIPPLED_DBG_PKG=$(ls rippled-debuginfo*.rpm)
 | 
			
		||||
RIPPLED_REPORTING_PKG=$(ls rippled-reporting*.rpm)
 | 
			
		||||
# TODO - where to upload src rpm ?
 | 
			
		||||
RIPPLED_SRC=$(ls rippled-[0-9]*.src.rpm)
 | 
			
		||||
echo "\"rpms\": {" >> "${TOPDIR}/files.info"
 | 
			
		||||
for rpm in ${RIPPLED_PKG} ${RIPPLED_DEV_PKG} ${RIPPLED_DBG_PKG} ${RIPPLED_REPORTING_PKG}; do
 | 
			
		||||
    # first item doesn't get a comma separator
 | 
			
		||||
    if [ $rpm != $RIPPLED_PKG ] ; then
 | 
			
		||||
        echo "," >> "${TOPDIR}/files.info"
 | 
			
		||||
    fi
 | 
			
		||||
    echo "\"${rpm}\"": | tee -a "${TOPDIR}/files.info"
 | 
			
		||||
    ca="${CURLARGS}"
 | 
			
		||||
    if [ "${action}" = "PUT" ] ; then
 | 
			
		||||
        url="https://${ARTIFACTORY_HOST}/artifactory/${RPM_REPO}/${COMPONENT}/"
 | 
			
		||||
        ca="${ca} -T${rpm}"
 | 
			
		||||
    elif [ "${action}" = "GET" ] ; then
 | 
			
		||||
        url="https://${ARTIFACTORY_HOST}/artifactory/api/storage/${RPM_REPO}/${COMPONENT}/${rpm}"
 | 
			
		||||
    fi
 | 
			
		||||
    echo "file info request url --> ${url}"
 | 
			
		||||
    eval "curl ${ca} \"${url}\"" | jq -M "${filter}" | tee -a "${TOPDIR}/files.info"
 | 
			
		||||
done
 | 
			
		||||
echo "}}" >> "${TOPDIR}/files.info"
 | 
			
		||||
jq '.' "${TOPDIR}/files.info" > "${TOPDIR}/files.info.tmp"
 | 
			
		||||
mv "${TOPDIR}/files.info.tmp" "${TOPDIR}/files.info"
 | 
			
		||||
 | 
			
		||||
if [ ! -z "${SLACK_NOTIFY_URL}" ] && [ "${action}" = "GET" ] ; then
 | 
			
		||||
    # extract files.info content to variable and sanitize so it can
 | 
			
		||||
    # be interpolated into a slack text field below
 | 
			
		||||
    finfo=$(cat ${TOPDIR}/files.info | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/\\n/g' | sed -E 's/"/\\"/g')
 | 
			
		||||
    # try posting file info to slack.
 | 
			
		||||
    # can add channel field to payload if the
 | 
			
		||||
    # default channel is incorrect. Get rid of
 | 
			
		||||
    # newlines in payload json since slack doesn't accept them
 | 
			
		||||
    CONTENT=$(tr -d '[\n]' <<JSON
 | 
			
		||||
       payload={
 | 
			
		||||
         "username": "GitlabCI",
 | 
			
		||||
         "text": "The package build for branch \`${CI_COMMIT_REF_NAME}\` is complete. File hashes are: \`\`\`${finfo}\`\`\`",
 | 
			
		||||
         "icon_emoji": ":package:"}
 | 
			
		||||
JSON
 | 
			
		||||
)
 | 
			
		||||
    curl ${SLACK_NOTIFY_URL} --data-urlencode "${CONTENT}"
 | 
			
		||||
fi
 | 
			
		||||
@@ -1,38 +0,0 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
set -eo pipefail
 | 
			
		||||
 | 
			
		||||
sign_dpkg() {
 | 
			
		||||
  if [ -n "${GPG_KEYID}" ]; then
 | 
			
		||||
    dpkg-sig \
 | 
			
		||||
      -g "--no-tty --digest-algo 'sha512' --passphrase '${GPG_PASSPHRASE}' --pinentry-mode=loopback" \
 | 
			
		||||
			-k "${GPG_KEYID}" \
 | 
			
		||||
			--sign builder \
 | 
			
		||||
			"build/dpkg/packages/*.deb"
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sign_rpm() {
 | 
			
		||||
  if [ -n "${GPG_KEYID}" ] ; then
 | 
			
		||||
    find build/rpm/packages -name "*.rpm" -exec bash -c '
 | 
			
		||||
	echo "yes" | setsid rpm \
 | 
			
		||||
			--define "_gpg_name ${GPG_KEYID}" \
 | 
			
		||||
			--define "_signature gpg" \
 | 
			
		||||
			--define "__gpg_check_password_cmd /bin/true" \
 | 
			
		||||
			--define "__gpg_sign_cmd %{__gpg} gpg --batch --no-armor --digest-algo 'sha512' --passphrase '${GPG_PASSPHRASE}' --no-secmem-warning -u '%{_gpg_name}' --sign --detach-sign --output %{__signature_filename} %{__plaintext_filename}" \
 | 
			
		||||
			--addsign '{} \;
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
case "${1}" in
 | 
			
		||||
    dpkg)
 | 
			
		||||
        sign_dpkg
 | 
			
		||||
        ;;
 | 
			
		||||
    rpm)
 | 
			
		||||
        sign_rpm
 | 
			
		||||
        ;;
 | 
			
		||||
    *)
 | 
			
		||||
        echo "Usage: ${0} (dpkg|rpm)"
 | 
			
		||||
        ;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
@@ -1,101 +0,0 @@
 | 
			
		||||
#!/usr/bin/env sh
 | 
			
		||||
set -e
 | 
			
		||||
install_from=$1
 | 
			
		||||
use_private=${2:-0} # this option not currently needed by any CI scripts,
 | 
			
		||||
                    # reserved for possible future use
 | 
			
		||||
if [ "$use_private" -gt 0 ] ; then
 | 
			
		||||
    REPO_ROOT="https://rippled:${ARTIFACTORY_DEPLOY_KEY_RIPPLED}@${ARTIFACTORY_HOST}/artifactory"
 | 
			
		||||
else
 | 
			
		||||
    REPO_ROOT="${PUBLIC_REPO_ROOT}"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
. ./Builds/containers/gitlab-ci/get_component.sh
 | 
			
		||||
 | 
			
		||||
. /etc/os-release
 | 
			
		||||
case ${ID} in
 | 
			
		||||
    ubuntu|debian)
 | 
			
		||||
        pkgtype="dpkg"
 | 
			
		||||
        ;;
 | 
			
		||||
    fedora|centos|rhel|scientific|rocky|almalinux)
 | 
			
		||||
        pkgtype="rpm"
 | 
			
		||||
        ;;
 | 
			
		||||
    *)
 | 
			
		||||
        echo "unrecognized distro!"
 | 
			
		||||
        exit 1
 | 
			
		||||
        ;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
# this script provides info variables about pkg version
 | 
			
		||||
. build/${pkgtype}/packages/build_vars
 | 
			
		||||
 | 
			
		||||
if [ "${pkgtype}" = "dpkg" ] ; then
 | 
			
		||||
    # sometimes update fails and requires a cleanup
 | 
			
		||||
    updateWithRetry()
 | 
			
		||||
    {
 | 
			
		||||
        if ! apt-get -y update ; then
 | 
			
		||||
            rm -rvf /var/lib/apt/lists/*
 | 
			
		||||
            apt-get -y clean
 | 
			
		||||
            apt-get -y update
 | 
			
		||||
        fi
 | 
			
		||||
    }
 | 
			
		||||
    if [ "${install_from}" = "repo" ] ; then
 | 
			
		||||
        apt-get -y upgrade
 | 
			
		||||
        updateWithRetry
 | 
			
		||||
        apt-get -y install apt apt-transport-https ca-certificates coreutils util-linux wget gnupg
 | 
			
		||||
        wget -q -O - "${REPO_ROOT}/api/gpg/key/public" | apt-key add -
 | 
			
		||||
        echo "deb ${REPO_ROOT}/${DEB_REPO} ${DISTRO} ${COMPONENT}" >> /etc/apt/sources.list
 | 
			
		||||
        updateWithRetry
 | 
			
		||||
        # uncomment this next line if you want to see the available package versions
 | 
			
		||||
        # apt-cache policy rippled
 | 
			
		||||
        apt-get -y install rippled=${dpkg_full_version}
 | 
			
		||||
    elif [ "${install_from}" = "local" ] ; then
 | 
			
		||||
        # cached pkg install
 | 
			
		||||
        updateWithRetry
 | 
			
		||||
        apt-get -y install libprotobuf-dev libprotoc-dev protobuf-compiler libssl-dev
 | 
			
		||||
        rm -f build/dpkg/packages/rippled-dbgsym*.*
 | 
			
		||||
        dpkg --no-debsig -i build/dpkg/packages/*.deb
 | 
			
		||||
    else
 | 
			
		||||
        echo "unrecognized pkg source!"
 | 
			
		||||
        exit 1
 | 
			
		||||
    fi
 | 
			
		||||
else
 | 
			
		||||
    yum -y update
 | 
			
		||||
    if [ "${install_from}" = "repo" ] ; then
 | 
			
		||||
        pkgs=("yum-utils coreutils util-linux")
 | 
			
		||||
        case "$ID" in
 | 
			
		||||
            rocky|almalinux)
 | 
			
		||||
                pkgs="${pkgs[@]/coreutils}"
 | 
			
		||||
        esac
 | 
			
		||||
        yum install -y $pkgs
 | 
			
		||||
        REPOFILE="/etc/yum.repos.d/artifactory.repo"
 | 
			
		||||
        echo "[Artifactory]" > ${REPOFILE}
 | 
			
		||||
        echo "name=Artifactory" >> ${REPOFILE}
 | 
			
		||||
        echo "baseurl=${REPO_ROOT}/${RPM_REPO}/${COMPONENT}/" >> ${REPOFILE}
 | 
			
		||||
        echo "enabled=1" >> ${REPOFILE}
 | 
			
		||||
        echo "gpgcheck=0" >> ${REPOFILE}
 | 
			
		||||
        echo "gpgkey=${REPO_ROOT}/${RPM_REPO}/${COMPONENT}/repodata/repomd.xml.key" >> ${REPOFILE}
 | 
			
		||||
        echo "repo_gpgcheck=1" >> ${REPOFILE}
 | 
			
		||||
        yum -y update
 | 
			
		||||
        # uncomment this next line if you want to see the available package versions
 | 
			
		||||
        # yum --showduplicates list rippled
 | 
			
		||||
        yum -y install ${rpm_version_release}
 | 
			
		||||
    elif [ "${install_from}" = "local" ] ; then
 | 
			
		||||
        rm -f build/rpm/packages/rippled-debug*.rpm
 | 
			
		||||
        rm -f build/rpm/packages/rippled-devel*.rpm
 | 
			
		||||
        rm -f build/rpm/packages/*.src.rpm
 | 
			
		||||
        rpm -i build/rpm/packages/*.rpm
 | 
			
		||||
    else
 | 
			
		||||
        echo "unrecognized pkg source!"
 | 
			
		||||
        exit 1
 | 
			
		||||
    fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# verify installed version
 | 
			
		||||
INSTALLED=$(/opt/ripple/bin/rippled --version | awk '{print $NF}')
 | 
			
		||||
if [ "${rippled_version}" != "${INSTALLED}" ] ; then
 | 
			
		||||
    echo "INSTALLED version ${INSTALLED} does not match ${rippled_version}"
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
# run unit tests
 | 
			
		||||
/opt/ripple/bin/rippled --unittest --unittest-jobs $(nproc)
 | 
			
		||||
/opt/ripple/bin/validator-keys --unittest
 | 
			
		||||
@@ -1,21 +0,0 @@
 | 
			
		||||
#!/usr/bin/env sh
 | 
			
		||||
set -e
 | 
			
		||||
docker login -u rippled \
 | 
			
		||||
    -p ${ARTIFACTORY_DEPLOY_KEY_RIPPLED} "${ARTIFACTORY_HUB}"
 | 
			
		||||
# this gives us rippled_version :
 | 
			
		||||
source build/rpm/packages/build_vars
 | 
			
		||||
docker pull "${ARTIFACTORY_HUB}/${RPM_CONTAINER_FULLNAME}"
 | 
			
		||||
docker pull "${ARTIFACTORY_HUB}/${DPKG_CONTAINER_FULLNAME}"
 | 
			
		||||
# tag/push two labels...one using the current rippled version and one just using "latest"
 | 
			
		||||
for label in ${rippled_version} latest ; do
 | 
			
		||||
    docker tag \
 | 
			
		||||
        "${ARTIFACTORY_HUB}/${RPM_CONTAINER_FULLNAME}" \
 | 
			
		||||
        "${ARTIFACTORY_HUB}/${RPM_CONTAINER_NAME}:${label}_${CI_COMMIT_REF_SLUG}"
 | 
			
		||||
    docker push \
 | 
			
		||||
        "${ARTIFACTORY_HUB}/${RPM_CONTAINER_NAME}:${label}_${CI_COMMIT_REF_SLUG}"
 | 
			
		||||
    docker tag \
 | 
			
		||||
        "${ARTIFACTORY_HUB}/${DPKG_CONTAINER_FULLNAME}" \
 | 
			
		||||
        "${ARTIFACTORY_HUB}/${DPKG_CONTAINER_NAME}:${label}_${CI_COMMIT_REF_SLUG}"
 | 
			
		||||
    docker push \
 | 
			
		||||
        "${ARTIFACTORY_HUB}/${DPKG_CONTAINER_NAME}:${label}_${CI_COMMIT_REF_SLUG}"
 | 
			
		||||
done
 | 
			
		||||
@@ -1,17 +0,0 @@
 | 
			
		||||
#!/usr/bin/env sh
 | 
			
		||||
set -ex
 | 
			
		||||
apt -y update
 | 
			
		||||
DEBIAN_FRONTEND="noninteractive" apt-get -y install tzdata
 | 
			
		||||
apt -y install software-properties-common curl git gnupg
 | 
			
		||||
curl -sk -o rippled-pubkeys.txt "${GIT_SIGN_PUBKEYS_URL}"
 | 
			
		||||
gpg --import rippled-pubkeys.txt
 | 
			
		||||
if git verify-commit HEAD; then
 | 
			
		||||
    echo "git commit signature check passed"
 | 
			
		||||
else
 | 
			
		||||
    echo "git commit signature check failed"
 | 
			
		||||
    git log -n 5 --color \
 | 
			
		||||
        --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an> [%G?]%Creset' \
 | 
			
		||||
        --abbrev-commit
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
@@ -1,99 +0,0 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
set -ex
 | 
			
		||||
 | 
			
		||||
# make sure pkg source files are up to date with repo
 | 
			
		||||
cd /opt/rippled_bld/pkg
 | 
			
		||||
cp -fpru rippled/Builds/containers/packaging/dpkg/debian/. debian/
 | 
			
		||||
cp -fpu rippled/Builds/containers/shared/rippled*.service debian/
 | 
			
		||||
cp -fpu rippled/Builds/containers/shared/update_sources.sh .
 | 
			
		||||
source update_sources.sh
 | 
			
		||||
 | 
			
		||||
# Build the dpkg
 | 
			
		||||
 | 
			
		||||
#dpkg uses - as separator, so we need to change our -bN versions to tilde
 | 
			
		||||
RIPPLED_DPKG_VERSION=$(echo "${RIPPLED_VERSION}" | sed 's!-!~!g')
 | 
			
		||||
# TODO - decide how to handle the trailing/release
 | 
			
		||||
# version here (hardcoded to 1). Does it ever need to change?
 | 
			
		||||
RIPPLED_DPKG_FULL_VERSION="${RIPPLED_DPKG_VERSION}-1"
 | 
			
		||||
git config --global --add safe.directory /opt/rippled_bld/pkg/rippled
 | 
			
		||||
cd /opt/rippled_bld/pkg/rippled
 | 
			
		||||
if [[ -n $(git status --porcelain) ]]; then
 | 
			
		||||
    git status
 | 
			
		||||
    error "Unstaged changes in this repo - please commit first"
 | 
			
		||||
fi
 | 
			
		||||
git archive --format tar.gz --prefix rippled-${RIPPLED_DPKG_VERSION}/ -o ../rippled-${RIPPLED_DPKG_VERSION}.tar.gz HEAD
 | 
			
		||||
cd ..
 | 
			
		||||
# dpkg debmake would normally create this link, but we do it manually
 | 
			
		||||
ln -s ./rippled-${RIPPLED_DPKG_VERSION}.tar.gz rippled_${RIPPLED_DPKG_VERSION}.orig.tar.gz
 | 
			
		||||
tar xvf rippled-${RIPPLED_DPKG_VERSION}.tar.gz
 | 
			
		||||
cd rippled-${RIPPLED_DPKG_VERSION}
 | 
			
		||||
cp -pr ../debian .
 | 
			
		||||
 | 
			
		||||
# dpkg requires a changelog. We don't currently maintain
 | 
			
		||||
# a useable one, so let's just fake it with our current version
 | 
			
		||||
# TODO : not sure if the "unstable" will need to change for
 | 
			
		||||
# release packages (?)
 | 
			
		||||
NOWSTR=$(TZ=UTC date -R)
 | 
			
		||||
cat << CHANGELOG > ./debian/changelog
 | 
			
		||||
rippled (${RIPPLED_DPKG_FULL_VERSION}) unstable; urgency=low
 | 
			
		||||
 | 
			
		||||
  * see RELEASENOTES
 | 
			
		||||
 | 
			
		||||
 -- Ripple Labs Inc. <support@ripple.com>  ${NOWSTR}
 | 
			
		||||
CHANGELOG
 | 
			
		||||
 | 
			
		||||
# PATH must be preserved for our more modern cmake in /opt/local
 | 
			
		||||
# TODO : consider allowing lintian to run in future ?
 | 
			
		||||
export DH_BUILD_DDEBS=1
 | 
			
		||||
debuild --no-lintian --preserve-envvar PATH --preserve-env -us -uc
 | 
			
		||||
rc=$?; if [[ $rc != 0 ]]; then
 | 
			
		||||
    error "error building dpkg"
 | 
			
		||||
fi
 | 
			
		||||
cd ..
 | 
			
		||||
 | 
			
		||||
# copy artifacts
 | 
			
		||||
cp rippled-reporting_${RIPPLED_DPKG_FULL_VERSION}_amd64.deb ${PKG_OUTDIR}
 | 
			
		||||
cp rippled_${RIPPLED_DPKG_FULL_VERSION}_amd64.deb ${PKG_OUTDIR}
 | 
			
		||||
cp rippled_${RIPPLED_DPKG_FULL_VERSION}.dsc ${PKG_OUTDIR}
 | 
			
		||||
# dbgsym suffix is ddeb under newer debuild, but just deb under earlier
 | 
			
		||||
cp rippled-dbgsym_${RIPPLED_DPKG_FULL_VERSION}_amd64.* ${PKG_OUTDIR}
 | 
			
		||||
cp rippled-reporting-dbgsym_${RIPPLED_DPKG_FULL_VERSION}_amd64.* ${PKG_OUTDIR}
 | 
			
		||||
cp rippled_${RIPPLED_DPKG_FULL_VERSION}_amd64.changes ${PKG_OUTDIR}
 | 
			
		||||
cp rippled_${RIPPLED_DPKG_FULL_VERSION}_amd64.build ${PKG_OUTDIR}
 | 
			
		||||
cp rippled_${RIPPLED_DPKG_VERSION}.orig.tar.gz ${PKG_OUTDIR}
 | 
			
		||||
cp rippled_${RIPPLED_DPKG_FULL_VERSION}.debian.tar.xz ${PKG_OUTDIR}
 | 
			
		||||
# buildinfo is only generated by later version of debuild
 | 
			
		||||
if [ -e rippled_${RIPPLED_DPKG_FULL_VERSION}_amd64.buildinfo ] ; then
 | 
			
		||||
    cp rippled_${RIPPLED_DPKG_FULL_VERSION}_amd64.buildinfo ${PKG_OUTDIR}
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
pushd ${PKG_OUTDIR}
 | 
			
		||||
for f in *.ddeb; do mv -- "$f" "${f%.ddeb}.deb"; done
 | 
			
		||||
popd
 | 
			
		||||
 | 
			
		||||
cat rippled_${RIPPLED_DPKG_FULL_VERSION}_amd64.changes
 | 
			
		||||
# extract the text in the .changes file that appears between
 | 
			
		||||
#    Checksums-Sha256:  ...
 | 
			
		||||
# and
 | 
			
		||||
#    Files: ...
 | 
			
		||||
awk '/Checksums-Sha256:/{hit=1;next}/Files:/{hit=0}hit' \
 | 
			
		||||
    rippled_${RIPPLED_DPKG_VERSION}-1_amd64.changes | \
 | 
			
		||||
        sed -E 's!^[[:space:]]+!!' > shasums
 | 
			
		||||
DEB_SHA256=$(cat shasums | \
 | 
			
		||||
    grep "rippled_${RIPPLED_DPKG_VERSION}-1_amd64.deb" | cut -d " " -f 1)
 | 
			
		||||
DBG_SHA256=$(cat shasums | \
 | 
			
		||||
    grep "rippled-dbgsym_${RIPPLED_DPKG_VERSION}-1_amd64.*" | cut -d " " -f 1)
 | 
			
		||||
REPORTING_DBG_SHA256=$(cat shasums | \
 | 
			
		||||
    grep "rippled-reporting-dbgsym_${RIPPLED_DPKG_VERSION}-1_amd64.*" | cut -d " " -f 1)
 | 
			
		||||
REPORTING_SHA256=$(cat shasums | \
 | 
			
		||||
    grep "rippled-reporting_${RIPPLED_DPKG_VERSION}-1_amd64.deb" | cut -d " " -f 1)
 | 
			
		||||
SRC_SHA256=$(cat shasums | \
 | 
			
		||||
    grep "rippled_${RIPPLED_DPKG_VERSION}.orig.tar.gz" | cut -d " " -f 1)
 | 
			
		||||
echo "deb_sha256=${DEB_SHA256}" >> ${PKG_OUTDIR}/build_vars
 | 
			
		||||
echo "dbg_sha256=${DBG_SHA256}" >> ${PKG_OUTDIR}/build_vars
 | 
			
		||||
echo "reporting_sha256=${REPORTING_SHA256}" >> ${PKG_OUTDIR}/build_vars
 | 
			
		||||
echo "reporting_dbg_sha256=${REPORTING_DBG_SHA256}" >> ${PKG_OUTDIR}/build_vars
 | 
			
		||||
echo "src_sha256=${SRC_SHA256}" >> ${PKG_OUTDIR}/build_vars
 | 
			
		||||
echo "rippled_version=${RIPPLED_VERSION}" >> ${PKG_OUTDIR}/build_vars
 | 
			
		||||
echo "dpkg_version=${RIPPLED_DPKG_VERSION}" >> ${PKG_OUTDIR}/build_vars
 | 
			
		||||
echo "dpkg_full_version=${RIPPLED_DPKG_FULL_VERSION}" >> ${PKG_OUTDIR}/build_vars
 | 
			
		||||
@@ -1,3 +0,0 @@
 | 
			
		||||
rippled daemon
 | 
			
		||||
 | 
			
		||||
 -- Mike Ellery <mellery451@gmail.com>  Tue, 04 Dec 2018 18:19:03 +0000
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
10
 | 
			
		||||
@@ -1,19 +0,0 @@
 | 
			
		||||
Source: rippled
 | 
			
		||||
Section: misc
 | 
			
		||||
Priority: extra
 | 
			
		||||
Maintainer: Ripple Labs Inc. <support@ripple.com>
 | 
			
		||||
Build-Depends: cmake, debhelper (>=9), zlib1g-dev, dh-systemd, ninja-build
 | 
			
		||||
Standards-Version: 3.9.7
 | 
			
		||||
Homepage: http://ripple.com/
 | 
			
		||||
 | 
			
		||||
Package: rippled
 | 
			
		||||
Architecture: any
 | 
			
		||||
Multi-Arch: foreign
 | 
			
		||||
Depends: ${misc:Depends}, ${shlibs:Depends}
 | 
			
		||||
Description: rippled daemon
 | 
			
		||||
 | 
			
		||||
Package: rippled-reporting
 | 
			
		||||
Architecture: any
 | 
			
		||||
Multi-Arch: foreign
 | 
			
		||||
Depends: ${misc:Depends}, ${shlibs:Depends}
 | 
			
		||||
Description: rippled reporting daemon
 | 
			
		||||
@@ -1,86 +0,0 @@
 | 
			
		||||
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
 | 
			
		||||
Upstream-Name: rippled
 | 
			
		||||
Source: https://github.com/ripple/rippled 
 | 
			
		||||
 | 
			
		||||
Files: *
 | 
			
		||||
Copyright: 2012-2019 Ripple Labs Inc.
 | 
			
		||||
 | 
			
		||||
License:   __UNKNOWN__
 | 
			
		||||
 | 
			
		||||
The accompanying files under various copyrights.
 | 
			
		||||
 | 
			
		||||
Copyright (c) 2012, 2013, 2014 Ripple Labs Inc.
 | 
			
		||||
 | 
			
		||||
Permission to use, copy, modify, and distribute this software for any
 | 
			
		||||
purpose with or without fee is hereby granted, provided that the above
 | 
			
		||||
copyright notice and this permission notice appear in all copies.
 | 
			
		||||
 | 
			
		||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 | 
			
		||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 | 
			
		||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 | 
			
		||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 | 
			
		||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 | 
			
		||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 | 
			
		||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 | 
			
		||||
 | 
			
		||||
The accompanying files incorporate work covered by the following copyright
 | 
			
		||||
and previous license notice:
 | 
			
		||||
 | 
			
		||||
Copyright (c) 2011 Arthur Britto, David Schwartz, Jed McCaleb,
 | 
			
		||||
Vinnie Falco, Bob Way, Eric Lombrozo, Nikolaos D. Bougalis, Howard Hinnant
 | 
			
		||||
 | 
			
		||||
Some code from Raw Material Software, Ltd., provided under the terms of the
 | 
			
		||||
  ISC License. See the corresponding source files for more details.
 | 
			
		||||
  Copyright (c) 2013 - Raw Material Software Ltd.
 | 
			
		||||
  Please visit http://www.juce.com
 | 
			
		||||
 | 
			
		||||
Some code from ASIO examples:
 | 
			
		||||
// Copyright (c) 2003-2011 Christopher M. Kohlhoff (chris at kohlhoff dot com)
 | 
			
		||||
//
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
 | 
			
		||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
 | 
			
		||||
Some code from Bitcoin:
 | 
			
		||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
 | 
			
		||||
// Copyright (c) 2011 The Bitcoin developers
 | 
			
		||||
// Distributed under the MIT/X11 software license, see the accompanying
 | 
			
		||||
// file license.txt or http://www.opensource.org/licenses/mit-license.php.
 | 
			
		||||
 | 
			
		||||
Some code from Tom Wu:
 | 
			
		||||
This software is covered under the following copyright:
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2003-2005  Tom Wu
 | 
			
		||||
 * All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Permission is hereby granted, free of charge, to any person obtaining
 | 
			
		||||
 * a copy of this software and associated documentation files (the
 | 
			
		||||
 * "Software"), to deal in the Software without restriction, including
 | 
			
		||||
 * without limitation the rights to use, copy, modify, merge, publish,
 | 
			
		||||
 * distribute, sublicense, and/or sell copies of the Software, and to
 | 
			
		||||
 * permit persons to whom the Software is furnished to do so, subject to
 | 
			
		||||
 * the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be
 | 
			
		||||
 * included in all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
 | 
			
		||||
 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
 | 
			
		||||
 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
 | 
			
		||||
 *
 | 
			
		||||
 * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
 | 
			
		||||
 * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER
 | 
			
		||||
 * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF
 | 
			
		||||
 * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT
 | 
			
		||||
 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 | 
			
		||||
 *
 | 
			
		||||
 * In addition, the following condition applies:
 | 
			
		||||
 *
 | 
			
		||||
 * All redistributions must retain an intact copy of this copyright notice
 | 
			
		||||
 * and disclaimer.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
Address all questions regarding this license to:
 | 
			
		||||
 | 
			
		||||
  Tom Wu
 | 
			
		||||
  tjw@cs.Stanford.EDU
 | 
			
		||||
@@ -1,3 +0,0 @@
 | 
			
		||||
/var/log/rippled/
 | 
			
		||||
/var/lib/rippled/
 | 
			
		||||
/etc/systemd/system/rippled.service.d/
 | 
			
		||||
@@ -1,3 +0,0 @@
 | 
			
		||||
README.md
 | 
			
		||||
LICENSE.md
 | 
			
		||||
RELEASENOTES.md
 | 
			
		||||
@@ -1,3 +0,0 @@
 | 
			
		||||
opt/ripple/include
 | 
			
		||||
opt/ripple/lib/*.a
 | 
			
		||||
opt/ripple/lib/cmake/ripple
 | 
			
		||||
@@ -1,3 +0,0 @@
 | 
			
		||||
/var/log/rippled-reporting/
 | 
			
		||||
/var/lib/rippled-reporting/
 | 
			
		||||
/etc/systemd/system/rippled-reporting.service.d/
 | 
			
		||||
@@ -1,8 +0,0 @@
 | 
			
		||||
build.rippled-reporting/rippled-reporting opt/rippled-reporting/bin
 | 
			
		||||
cfg/rippled-reporting.cfg opt/rippled-reporting/etc
 | 
			
		||||
debian/tmp/opt/rippled-reporting/etc/validators.txt opt/rippled-reporting/etc
 | 
			
		||||
 | 
			
		||||
opt/rippled-reporting/bin/update-rippled-reporting.sh
 | 
			
		||||
opt/rippled-reporting/bin/getRippledReportingInfo
 | 
			
		||||
opt/rippled-reporting/etc/update-rippled-reporting-cron
 | 
			
		||||
etc/logrotate.d/rippled-reporting
 | 
			
		||||
@@ -1,3 +0,0 @@
 | 
			
		||||
opt/rippled-reporting/etc/rippled-reporting.cfg etc/opt/rippled-reporting/rippled-reporting.cfg
 | 
			
		||||
opt/rippled-reporting/etc/validators.txt etc/opt/rippled-reporting/validators.txt
 | 
			
		||||
opt/rippled-reporting/bin/rippled-reporting usr/local/bin/rippled-reporting
 | 
			
		||||
@@ -1,33 +0,0 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
set -e
 | 
			
		||||
 | 
			
		||||
USER_NAME=rippled-reporting
 | 
			
		||||
GROUP_NAME=rippled-reporting
 | 
			
		||||
case "$1" in
 | 
			
		||||
    configure)
 | 
			
		||||
        id -u $USER_NAME >/dev/null 2>&1 || \
 | 
			
		||||
        adduser --system --quiet \
 | 
			
		||||
            --home /nonexistent --no-create-home \
 | 
			
		||||
            --disabled-password \
 | 
			
		||||
            --group "$GROUP_NAME"
 | 
			
		||||
        chown -R $USER_NAME:$GROUP_NAME /var/log/rippled-reporting/
 | 
			
		||||
        chown -R $USER_NAME:$GROUP_NAME /var/lib/rippled-reporting/
 | 
			
		||||
        chmod 755 /var/log/rippled-reporting/
 | 
			
		||||
        chmod 755 /var/lib/rippled-reporting/
 | 
			
		||||
        chown -R $USER_NAME:$GROUP_NAME /opt/rippled-reporting
 | 
			
		||||
 | 
			
		||||
    ;;
 | 
			
		||||
 | 
			
		||||
    abort-upgrade|abort-remove|abort-deconfigure)
 | 
			
		||||
    ;;
 | 
			
		||||
 | 
			
		||||
    *)
 | 
			
		||||
        echo "postinst called with unknown argument \`$1'" >&2
 | 
			
		||||
        exit 1
 | 
			
		||||
    ;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#DEBHELPER#
 | 
			
		||||
 | 
			
		||||
exit 0
 | 
			
		||||
@@ -1,2 +0,0 @@
 | 
			
		||||
/opt/ripple/etc/rippled.cfg
 | 
			
		||||
/opt/ripple/etc/validators.txt
 | 
			
		||||
@@ -1,8 +0,0 @@
 | 
			
		||||
opt/ripple/bin/rippled
 | 
			
		||||
opt/ripple/bin/validator-keys
 | 
			
		||||
opt/ripple/bin/update-rippled.sh
 | 
			
		||||
opt/ripple/bin/getRippledInfo
 | 
			
		||||
opt/ripple/etc/rippled.cfg
 | 
			
		||||
opt/ripple/etc/validators.txt
 | 
			
		||||
opt/ripple/etc/update-rippled-cron
 | 
			
		||||
etc/logrotate.d/rippled
 | 
			
		||||
@@ -1,3 +0,0 @@
 | 
			
		||||
opt/ripple/etc/rippled.cfg etc/opt/ripple/rippled.cfg
 | 
			
		||||
opt/ripple/etc/validators.txt etc/opt/ripple/validators.txt
 | 
			
		||||
opt/ripple/bin/rippled usr/local/bin/rippled
 | 
			
		||||
@@ -1,35 +0,0 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
set -e
 | 
			
		||||
 | 
			
		||||
USER_NAME=rippled
 | 
			
		||||
GROUP_NAME=rippled
 | 
			
		||||
case "$1" in
 | 
			
		||||
    configure)
 | 
			
		||||
        id -u $USER_NAME >/dev/null 2>&1 || \
 | 
			
		||||
        adduser --system --quiet \
 | 
			
		||||
            --home /nonexistent --no-create-home \
 | 
			
		||||
            --disabled-password \
 | 
			
		||||
            --group "$GROUP_NAME"
 | 
			
		||||
        chown -R $USER_NAME:$GROUP_NAME /var/log/rippled/
 | 
			
		||||
        chown -R $USER_NAME:$GROUP_NAME /var/lib/rippled/
 | 
			
		||||
        chown -R $USER_NAME:$GROUP_NAME /opt/ripple
 | 
			
		||||
        chmod 755 /var/log/rippled/
 | 
			
		||||
        chmod 755 /var/lib/rippled/
 | 
			
		||||
        chmod 644 /opt/ripple/etc/update-rippled-cron
 | 
			
		||||
        chmod 644 /etc/logrotate.d/rippled
 | 
			
		||||
        chown -R root:$GROUP_NAME /opt/ripple/etc/update-rippled-cron
 | 
			
		||||
    ;;
 | 
			
		||||
 | 
			
		||||
    abort-upgrade|abort-remove|abort-deconfigure)
 | 
			
		||||
    ;;
 | 
			
		||||
 | 
			
		||||
    *)
 | 
			
		||||
        echo "postinst called with unknown argument \`$1'" >&2
 | 
			
		||||
        exit 1
 | 
			
		||||
    ;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#DEBHELPER#
 | 
			
		||||
 | 
			
		||||
exit 0
 | 
			
		||||
@@ -1,17 +0,0 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
set -e
 | 
			
		||||
 | 
			
		||||
case "$1" in
 | 
			
		||||
    purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
 | 
			
		||||
    ;;
 | 
			
		||||
 | 
			
		||||
    *)
 | 
			
		||||
        echo "postrm called with unknown argument \`$1'" >&2
 | 
			
		||||
        exit 1
 | 
			
		||||
    ;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#DEBHELPER#
 | 
			
		||||
 | 
			
		||||
exit 0
 | 
			
		||||
@@ -1,20 +0,0 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
set -e
 | 
			
		||||
 | 
			
		||||
case "$1" in
 | 
			
		||||
    install|upgrade)
 | 
			
		||||
    ;;
 | 
			
		||||
 | 
			
		||||
    abort-upgrade)
 | 
			
		||||
    ;;
 | 
			
		||||
 | 
			
		||||
    *)
 | 
			
		||||
        echo "preinst called with unknown argument \`$1'" >&2
 | 
			
		||||
        exit 1
 | 
			
		||||
    ;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#DEBHELPER#
 | 
			
		||||
 | 
			
		||||
exit 0
 | 
			
		||||
@@ -1,20 +0,0 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
set -e
 | 
			
		||||
 | 
			
		||||
case "$1" in
 | 
			
		||||
    remove|upgrade|deconfigure)
 | 
			
		||||
    ;;
 | 
			
		||||
 | 
			
		||||
    failed-upgrade)
 | 
			
		||||
    ;;
 | 
			
		||||
 | 
			
		||||
    *)
 | 
			
		||||
        echo "prerm called with unknown argument \`$1'" >&2
 | 
			
		||||
        exit 1
 | 
			
		||||
    ;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#DEBHELPER#
 | 
			
		||||
 | 
			
		||||
exit 0
 | 
			
		||||
@@ -1,81 +0,0 @@
 | 
			
		||||
#!/usr/bin/make -f
 | 
			
		||||
export DH_VERBOSE = 1
 | 
			
		||||
export DH_OPTIONS = -v
 | 
			
		||||
# debuild sets some warnings that don't work well
 | 
			
		||||
# for our curent build..so try to remove those flags here:
 | 
			
		||||
export CFLAGS:=$(subst -Wformat,,$(CFLAGS))
 | 
			
		||||
export CFLAGS:=$(subst -Werror=format-security,,$(CFLAGS))
 | 
			
		||||
export CXXFLAGS:=$(subst -Wformat,,$(CXXFLAGS))
 | 
			
		||||
export CXXFLAGS:=$(subst -Werror=format-security,,$(CXXFLAGS))
 | 
			
		||||
 | 
			
		||||
%:
 | 
			
		||||
	dh $@ --with systemd
 | 
			
		||||
 | 
			
		||||
override_dh_systemd_start:
 | 
			
		||||
	dh_systemd_start --no-restart-on-upgrade
 | 
			
		||||
 | 
			
		||||
override_dh_auto_configure:
 | 
			
		||||
	/root/.pyenv/shims/conan export external/snappy snappy/1.1.10@
 | 
			
		||||
	/root/.pyenv/shims/conan export external/soci soci/4.0.3@
 | 
			
		||||
 | 
			
		||||
	mkdir build.rippled
 | 
			
		||||
 | 
			
		||||
	cd build.rippled && \
 | 
			
		||||
		/root/.pyenv/shims/conan install .. \
 | 
			
		||||
			--profile gcc \
 | 
			
		||||
			--output-folder . \
 | 
			
		||||
			--build missing \
 | 
			
		||||
			--settings build_type=Release
 | 
			
		||||
 | 
			
		||||
	cd build.rippled && \
 | 
			
		||||
		cmake .. \
 | 
			
		||||
			-DCMAKE_BUILD_TYPE=Release \
 | 
			
		||||
			-Dvalidator_keys=ON \
 | 
			
		||||
			-DCMAKE_VERBOSE_MAKEFILE=ON \
 | 
			
		||||
			-DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake
 | 
			
		||||
 | 
			
		||||
	mkdir build.rippled-reporting
 | 
			
		||||
 | 
			
		||||
	cd build.rippled-reporting && \
 | 
			
		||||
		/root/.pyenv/shims/conan install .. \
 | 
			
		||||
			--profile gcc \
 | 
			
		||||
			--output-folder . \
 | 
			
		||||
			--settings compiler.cppstd=17 \
 | 
			
		||||
			--settings build_type=Release \
 | 
			
		||||
			--build missing \
 | 
			
		||||
			--build boost \
 | 
			
		||||
			--build sqlite3 \
 | 
			
		||||
			--build libuv \
 | 
			
		||||
			--options reporting=True
 | 
			
		||||
 | 
			
		||||
	cd build.rippled-reporting && \
 | 
			
		||||
		cmake .. \
 | 
			
		||||
			-DCMAKE_BUILD_TYPE=Release \
 | 
			
		||||
			-Dvalidator_keys=ON \
 | 
			
		||||
			-Dstatic=ON \
 | 
			
		||||
			-Dunity=OFF \
 | 
			
		||||
			-Dreporting=ON \
 | 
			
		||||
			-DCMAKE_VERBOSE_MAKEFILE=ON \
 | 
			
		||||
			-DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake
 | 
			
		||||
 | 
			
		||||
override_dh_auto_build:
 | 
			
		||||
	cmake --build build.rippled --target rippled --target validator-keys --parallel 8
 | 
			
		||||
	cmake --build build.rippled-reporting --target rippled --parallel 8
 | 
			
		||||
 | 
			
		||||
override_dh_auto_install:
 | 
			
		||||
	cmake --install build.rippled --prefix debian/tmp/opt/ripple
 | 
			
		||||
	install -D build.rippled/validator-keys/validator-keys debian/tmp/opt/ripple/bin/validator-keys
 | 
			
		||||
	install -D Builds/containers/shared/update-rippled.sh debian/tmp/opt/ripple/bin/update-rippled.sh
 | 
			
		||||
	install -D bin/getRippledInfo debian/tmp/opt/ripple/bin/getRippledInfo
 | 
			
		||||
	install -D Builds/containers/shared/update-rippled-cron debian/tmp/opt/ripple/etc/update-rippled-cron
 | 
			
		||||
	install -D Builds/containers/shared/rippled-logrotate debian/tmp/etc/logrotate.d/rippled
 | 
			
		||||
	rm -rf debian/tmp/opt/ripple/lib64/cmake/date
 | 
			
		||||
 | 
			
		||||
	mkdir -p debian/tmp/opt/rippled-reporting/etc
 | 
			
		||||
	mkdir -p debian/tmp/opt/rippled-reporting/bin
 | 
			
		||||
	cp cfg/validators-example.txt debian/tmp/opt/rippled-reporting/etc/validators.txt
 | 
			
		||||
 | 
			
		||||
	sed -E 's/rippled?/rippled-reporting/g' Builds/containers/shared/update-rippled.sh > debian/tmp/opt/rippled-reporting/bin/update-rippled-reporting.sh
 | 
			
		||||
	sed -E 's/rippled?/rippled-reporting/g' bin/getRippledInfo > debian/tmp/opt/rippled-reporting/bin/getRippledReportingInfo
 | 
			
		||||
	sed -E 's/rippled?/rippled-reporting/g' Builds/containers/shared/update-rippled-cron > debian/tmp/opt/rippled-reporting/etc/update-rippled-reporting-cron
 | 
			
		||||
	sed -E 's/rippled?/rippled-reporting/g' Builds/containers/shared/rippled-logrotate > debian/tmp/etc/logrotate.d/rippled-reporting
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
3.0 (quilt)
 | 
			
		||||
@@ -1,2 +0,0 @@
 | 
			
		||||
#abort-on-upstream-changes
 | 
			
		||||
#unapply-patches
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
enable rippled-reporting.service
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
enable rippled.service
 | 
			
		||||
@@ -1,82 +0,0 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
set -ex
 | 
			
		||||
 | 
			
		||||
cd /opt/rippled_bld/pkg
 | 
			
		||||
cp -fpu rippled/Builds/containers/packaging/rpm/rippled.spec .
 | 
			
		||||
cp -fpu rippled/Builds/containers/shared/update_sources.sh .
 | 
			
		||||
source update_sources.sh
 | 
			
		||||
 | 
			
		||||
# Build the rpm
 | 
			
		||||
 | 
			
		||||
IFS='-' read -r RIPPLED_RPM_VERSION RELEASE <<< "$RIPPLED_VERSION"
 | 
			
		||||
export RIPPLED_RPM_VERSION
 | 
			
		||||
 | 
			
		||||
RPM_RELEASE=${RPM_RELEASE-1}
 | 
			
		||||
 | 
			
		||||
# post-release version
 | 
			
		||||
if [ "hf" = "$(echo "$RELEASE" | cut -c -2)" ]; then
 | 
			
		||||
    RPM_RELEASE="${RPM_RELEASE}.${RELEASE}"
 | 
			
		||||
# pre-release version (-b or -rc)
 | 
			
		||||
elif [[ $RELEASE ]]; then
 | 
			
		||||
    RPM_RELEASE="0.${RPM_RELEASE}.${RELEASE}"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
export RPM_RELEASE
 | 
			
		||||
 | 
			
		||||
if [[ $RPM_PATCH ]]; then
 | 
			
		||||
    RPM_PATCH=".${RPM_PATCH}"
 | 
			
		||||
    export RPM_PATCH
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
cd /opt/rippled_bld/pkg/rippled
 | 
			
		||||
 | 
			
		||||
if [[ -n $(git status --porcelain) ]]; then
 | 
			
		||||
   git status
 | 
			
		||||
   error "Unstaged changes in this repo - please commit first"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
git archive --format tar.gz --prefix rippled/ -o ../rpmbuild/SOURCES/rippled.tar.gz HEAD
 | 
			
		||||
 | 
			
		||||
cd ..
 | 
			
		||||
 | 
			
		||||
source /opt/rh/devtoolset-11/enable
 | 
			
		||||
 | 
			
		||||
rpmbuild --define "_topdir ${PWD}/rpmbuild" -ba rippled.spec
 | 
			
		||||
 | 
			
		||||
rc=$?; if [[ $rc != 0 ]]; then
 | 
			
		||||
    error "error building rpm"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Make a tar of the rpm and source rpm
 | 
			
		||||
RPM_VERSION_RELEASE=$(rpm -qp --qf='%{NAME}-%{VERSION}-%{RELEASE}' ./rpmbuild/RPMS/x86_64/rippled-[0-9]*.rpm)
 | 
			
		||||
tar_file=$RPM_VERSION_RELEASE.tar.gz
 | 
			
		||||
 | 
			
		||||
cp ./rpmbuild/RPMS/x86_64/* ${PKG_OUTDIR}
 | 
			
		||||
cp ./rpmbuild/SRPMS/* ${PKG_OUTDIR}
 | 
			
		||||
 | 
			
		||||
RPM_MD5SUM=$(rpm -q --queryformat '%{SIGMD5}\n' -p ./rpmbuild/RPMS/x86_64/rippled-[0-9]*.rpm 2>/dev/null)
 | 
			
		||||
DBG_MD5SUM=$(rpm -q --queryformat '%{SIGMD5}\n' -p ./rpmbuild/RPMS/x86_64/rippled-debuginfo*.rpm 2>/dev/null)
 | 
			
		||||
DEV_MD5SUM=$(rpm -q --queryformat '%{SIGMD5}\n' -p ./rpmbuild/RPMS/x86_64/rippled-devel*.rpm 2>/dev/null)
 | 
			
		||||
REP_MD5SUM=$(rpm -q --queryformat '%{SIGMD5}\n' -p ./rpmbuild/RPMS/x86_64/rippled-reporting*.rpm 2>/dev/null)
 | 
			
		||||
SRC_MD5SUM=$(rpm -q --queryformat '%{SIGMD5}\n' -p ./rpmbuild/SRPMS/*.rpm 2>/dev/null)
 | 
			
		||||
 | 
			
		||||
RPM_SHA256="$(sha256sum ./rpmbuild/RPMS/x86_64/rippled-[0-9]*.rpm | awk '{ print $1}')"
 | 
			
		||||
DBG_SHA256="$(sha256sum ./rpmbuild/RPMS/x86_64/rippled-debuginfo*.rpm | awk '{ print $1}')"
 | 
			
		||||
REP_SHA256="$(sha256sum ./rpmbuild/RPMS/x86_64/rippled-reporting*.rpm | awk '{ print $1}')"
 | 
			
		||||
DEV_SHA256="$(sha256sum ./rpmbuild/RPMS/x86_64/rippled-devel*.rpm | awk '{ print $1}')"
 | 
			
		||||
SRC_SHA256="$(sha256sum ./rpmbuild/SRPMS/*.rpm | awk '{ print $1}')"
 | 
			
		||||
 | 
			
		||||
echo "rpm_md5sum=$RPM_MD5SUM" >  ${PKG_OUTDIR}/build_vars
 | 
			
		||||
echo "rep_md5sum=$REP_MD5SUM" >> ${PKG_OUTDIR}/build_vars
 | 
			
		||||
echo "dbg_md5sum=$DBG_MD5SUM" >> ${PKG_OUTDIR}/build_vars
 | 
			
		||||
echo "dev_md5sum=$DEV_MD5SUM" >> ${PKG_OUTDIR}/build_vars
 | 
			
		||||
echo "src_md5sum=$SRC_MD5SUM" >> ${PKG_OUTDIR}/build_vars
 | 
			
		||||
echo "rpm_sha256=$RPM_SHA256" >> ${PKG_OUTDIR}/build_vars
 | 
			
		||||
echo "rep_sha256=$REP_SHA256" >> ${PKG_OUTDIR}/build_vars
 | 
			
		||||
echo "dbg_sha256=$DBG_SHA256" >> ${PKG_OUTDIR}/build_vars
 | 
			
		||||
echo "dev_sha256=$DEV_SHA256" >> ${PKG_OUTDIR}/build_vars
 | 
			
		||||
echo "src_sha256=$SRC_SHA256" >> ${PKG_OUTDIR}/build_vars
 | 
			
		||||
echo "rippled_version=$RIPPLED_VERSION" >> ${PKG_OUTDIR}/build_vars
 | 
			
		||||
echo "rpm_version=$RIPPLED_RPM_VERSION" >> ${PKG_OUTDIR}/build_vars
 | 
			
		||||
echo "rpm_file_name=$tar_file" >> ${PKG_OUTDIR}/build_vars
 | 
			
		||||
echo "rpm_version_release=$RPM_VERSION_RELEASE" >> ${PKG_OUTDIR}/build_vars
 | 
			
		||||
@@ -1,239 +0,0 @@
 | 
			
		||||
%define rippled_version %(echo $RIPPLED_RPM_VERSION)
 | 
			
		||||
%define rpm_release %(echo $RPM_RELEASE)
 | 
			
		||||
%define rpm_patch %(echo $RPM_PATCH)
 | 
			
		||||
%define _prefix /opt/ripple
 | 
			
		||||
 | 
			
		||||
Name:           rippled
 | 
			
		||||
# Dashes in Version extensions must be converted to underscores
 | 
			
		||||
Version:        %{rippled_version}
 | 
			
		||||
Release:        %{rpm_release}%{?dist}%{rpm_patch}
 | 
			
		||||
Summary:        rippled daemon
 | 
			
		||||
 | 
			
		||||
License:        MIT
 | 
			
		||||
URL:            http://ripple.com/
 | 
			
		||||
Source0:        rippled.tar.gz
 | 
			
		||||
 | 
			
		||||
BuildRequires:  cmake zlib-static ninja-build
 | 
			
		||||
 | 
			
		||||
%description
 | 
			
		||||
rippled
 | 
			
		||||
 | 
			
		||||
%package devel
 | 
			
		||||
Summary: Files for development of applications using xrpl core library
 | 
			
		||||
Group: Development/Libraries
 | 
			
		||||
Requires: zlib-static
 | 
			
		||||
 | 
			
		||||
%description devel
 | 
			
		||||
core library for development of standalone applications that sign transactions.
 | 
			
		||||
 | 
			
		||||
%package reporting
 | 
			
		||||
Summary: Reporting Server for rippled
 | 
			
		||||
 | 
			
		||||
%description reporting
 | 
			
		||||
History server for XRP Ledger
 | 
			
		||||
 | 
			
		||||
%prep
 | 
			
		||||
%setup -c -n rippled
 | 
			
		||||
 | 
			
		||||
%build
 | 
			
		||||
 | 
			
		||||
source /opt/rh/devtoolset-11/enable
 | 
			
		||||
source /opt/rh/rh-python38/enable
 | 
			
		||||
 | 
			
		||||
pip install "conan<2"
 | 
			
		||||
 | 
			
		||||
conan profile new default --detect
 | 
			
		||||
conan profile update settings.compiler.cppstd=20 default
 | 
			
		||||
conan profile update settings.compiler.libcxx=libstdc++11 default
 | 
			
		||||
 | 
			
		||||
cd rippled
 | 
			
		||||
 | 
			
		||||
conan export external/snappy snappy/1.1.10@
 | 
			
		||||
conan export external/soci soci/4.0.3@
 | 
			
		||||
 | 
			
		||||
mkdir -p bld.rippled
 | 
			
		||||
pushd bld.rippled
 | 
			
		||||
 | 
			
		||||
cp /opt/libcstd/libstdc++.so.6.0.22 /usr/lib64
 | 
			
		||||
cp /opt/libcstd/libstdc++.so.6.0.22 /lib64
 | 
			
		||||
ln -sf /usr/lib64/libstdc++.so.6.0.22 /usr/lib64/libstdc++.so.6
 | 
			
		||||
ln -sf /lib64/libstdc++.so.6.0.22 /usr/lib64/libstdc++.so.6
 | 
			
		||||
 | 
			
		||||
conan install .. \
 | 
			
		||||
    --profile default \
 | 
			
		||||
    --output-folder . \
 | 
			
		||||
    --build missing \
 | 
			
		||||
    --settings build_type=Release
 | 
			
		||||
 | 
			
		||||
cmake .. \
 | 
			
		||||
    -DCMAKE_BUILD_TYPE=Release \
 | 
			
		||||
    -Dvalidator_keys=ON \
 | 
			
		||||
    -DCMAKE_INSTALL_PREFIX=%{_prefix} \
 | 
			
		||||
    -DCMAKE_VERBOSE_MAKEFILE=ON \
 | 
			
		||||
    -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake
 | 
			
		||||
 | 
			
		||||
cmake --build . --parallel $(nproc) --target rippled --target validator-keys
 | 
			
		||||
 | 
			
		||||
popd
 | 
			
		||||
 | 
			
		||||
mkdir -p bld.rippled-reporting
 | 
			
		||||
pushd bld.rippled-reporting
 | 
			
		||||
 | 
			
		||||
conan install .. \
 | 
			
		||||
     --settings build_type=Release \
 | 
			
		||||
     --output-folder . \
 | 
			
		||||
     --build missing \
 | 
			
		||||
     --settings compiler.cppstd=17 \
 | 
			
		||||
     --options reporting=True
 | 
			
		||||
 | 
			
		||||
cmake .. \
 | 
			
		||||
    -G Ninja \
 | 
			
		||||
    -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake \
 | 
			
		||||
    -DCMAKE_INSTALL_PREFIX=%{_prefix} \
 | 
			
		||||
    -DCMAKE_BUILD_TYPE=Release \
 | 
			
		||||
    -Dunity=OFF \
 | 
			
		||||
    -Dstatic=ON \
 | 
			
		||||
    -Dvalidator_keys=ON \
 | 
			
		||||
    -Dreporting=ON \
 | 
			
		||||
    -DCMAKE_VERBOSE_MAKEFILE=ON \
 | 
			
		||||
 | 
			
		||||
cmake --build . --parallel $(nproc) --target rippled
 | 
			
		||||
 | 
			
		||||
%pre
 | 
			
		||||
test -e /etc/pki/tls || { mkdir -p /etc/pki; ln -s /usr/lib/ssl /etc/pki/tls; }
 | 
			
		||||
 | 
			
		||||
%install
 | 
			
		||||
rm -rf $RPM_BUILD_ROOT
 | 
			
		||||
DESTDIR=$RPM_BUILD_ROOT cmake --build rippled/bld.rippled --target install #-- -v
 | 
			
		||||
mkdir -p $RPM_BUILD_ROOT
 | 
			
		||||
rm -rf ${RPM_BUILD_ROOT}%{_prefix}/lib64/
 | 
			
		||||
install -d ${RPM_BUILD_ROOT}/etc/opt/ripple
 | 
			
		||||
install -d ${RPM_BUILD_ROOT}/usr/local/bin
 | 
			
		||||
 | 
			
		||||
install -D ./rippled/cfg/rippled-example.cfg ${RPM_BUILD_ROOT}/%{_prefix}/etc/rippled.cfg
 | 
			
		||||
install -D ./rippled/cfg/validators-example.txt ${RPM_BUILD_ROOT}/%{_prefix}/etc/validators.txt
 | 
			
		||||
 | 
			
		||||
ln -sf %{_prefix}/etc/rippled.cfg ${RPM_BUILD_ROOT}/etc/opt/ripple/rippled.cfg
 | 
			
		||||
ln -sf %{_prefix}/etc/validators.txt ${RPM_BUILD_ROOT}/etc/opt/ripple/validators.txt
 | 
			
		||||
ln -sf %{_prefix}/bin/rippled ${RPM_BUILD_ROOT}/usr/local/bin/rippled
 | 
			
		||||
install -D rippled/bld.rippled/validator-keys/validator-keys ${RPM_BUILD_ROOT}%{_bindir}/validator-keys
 | 
			
		||||
install -D ./rippled/Builds/containers/shared/rippled.service ${RPM_BUILD_ROOT}/usr/lib/systemd/system/rippled.service
 | 
			
		||||
install -D ./rippled/Builds/containers/packaging/rpm/50-rippled.preset ${RPM_BUILD_ROOT}/usr/lib/systemd/system-preset/50-rippled.preset
 | 
			
		||||
install -D ./rippled/Builds/containers/shared/update-rippled.sh ${RPM_BUILD_ROOT}%{_bindir}/update-rippled.sh
 | 
			
		||||
install -D ./rippled/bin/getRippledInfo ${RPM_BUILD_ROOT}%{_bindir}/getRippledInfo
 | 
			
		||||
install -D ./rippled/Builds/containers/shared/update-rippled-cron ${RPM_BUILD_ROOT}%{_prefix}/etc/update-rippled-cron
 | 
			
		||||
install -D ./rippled/Builds/containers/shared/rippled-logrotate ${RPM_BUILD_ROOT}/etc/logrotate.d/rippled
 | 
			
		||||
install -d $RPM_BUILD_ROOT/var/log/rippled
 | 
			
		||||
install -d $RPM_BUILD_ROOT/var/lib/rippled
 | 
			
		||||
 | 
			
		||||
# reporting mode
 | 
			
		||||
%define _prefix /opt/rippled-reporting
 | 
			
		||||
mkdir -p ${RPM_BUILD_ROOT}/etc/opt/rippled-reporting/
 | 
			
		||||
install -D rippled/bld.rippled-reporting/rippled-reporting ${RPM_BUILD_ROOT}%{_bindir}/rippled-reporting
 | 
			
		||||
install -D ./rippled/cfg/rippled-reporting.cfg ${RPM_BUILD_ROOT}%{_prefix}/etc/rippled-reporting.cfg
 | 
			
		||||
install -D ./rippled/cfg/validators-example.txt ${RPM_BUILD_ROOT}%{_prefix}/etc/validators.txt
 | 
			
		||||
install -D ./rippled/Builds/containers/packaging/rpm/50-rippled-reporting.preset ${RPM_BUILD_ROOT}/usr/lib/systemd/system-preset/50-rippled-reporting.preset
 | 
			
		||||
ln -sf %{_prefix}/bin/rippled-reporting ${RPM_BUILD_ROOT}/usr/local/bin/rippled-reporting
 | 
			
		||||
ln -sf %{_prefix}/etc/rippled-reporting.cfg ${RPM_BUILD_ROOT}/etc/opt/rippled-reporting/rippled-reporting.cfg
 | 
			
		||||
ln -sf %{_prefix}/etc/validators.txt ${RPM_BUILD_ROOT}/etc/opt/rippled-reporting/validators.txt
 | 
			
		||||
install -d $RPM_BUILD_ROOT/var/log/rippled-reporting
 | 
			
		||||
install -d $RPM_BUILD_ROOT/var/lib/rippled-reporting
 | 
			
		||||
install -D ./rippled/Builds/containers/shared/rippled-reporting.service ${RPM_BUILD_ROOT}/usr/lib/systemd/system/rippled-reporting.service
 | 
			
		||||
sed -E 's/rippled?/rippled-reporting/g' ./rippled/Builds/containers/shared/update-rippled.sh > ${RPM_BUILD_ROOT}%{_bindir}/update-rippled-reporting.sh
 | 
			
		||||
sed -E 's/rippled?/rippled-reporting/g' ./rippled/bin/getRippledInfo > ${RPM_BUILD_ROOT}%{_bindir}/getRippledReportingInfo
 | 
			
		||||
sed -E 's/rippled?/rippled-reporting/g' ./rippled/Builds/containers/shared/update-rippled-cron > ${RPM_BUILD_ROOT}%{_prefix}/etc/update-rippled-reporting-cron
 | 
			
		||||
sed -E 's/rippled?/rippled-reporting/g' ./rippled/Builds/containers/shared/rippled-logrotate > ${RPM_BUILD_ROOT}/etc/logrotate.d/rippled-reporting
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
%post
 | 
			
		||||
%define _prefix /opt/ripple
 | 
			
		||||
USER_NAME=rippled
 | 
			
		||||
GROUP_NAME=rippled
 | 
			
		||||
 | 
			
		||||
getent passwd $USER_NAME &>/dev/null || useradd $USER_NAME
 | 
			
		||||
getent group $GROUP_NAME &>/dev/null || groupadd $GROUP_NAME
 | 
			
		||||
 | 
			
		||||
chown -R $USER_NAME:$GROUP_NAME /var/log/rippled/
 | 
			
		||||
chown -R $USER_NAME:$GROUP_NAME /var/lib/rippled/
 | 
			
		||||
chown -R $USER_NAME:$GROUP_NAME %{_prefix}/
 | 
			
		||||
 | 
			
		||||
chmod 755 /var/log/rippled/
 | 
			
		||||
chmod 755 /var/lib/rippled/
 | 
			
		||||
 | 
			
		||||
chmod 644 %{_prefix}/etc/update-rippled-cron
 | 
			
		||||
chmod 644 /etc/logrotate.d/rippled
 | 
			
		||||
chown -R root:$GROUP_NAME %{_prefix}/etc/update-rippled-cron
 | 
			
		||||
 | 
			
		||||
%post reporting
 | 
			
		||||
%define _prefix /opt/rippled-reporting
 | 
			
		||||
USER_NAME=rippled-reporting
 | 
			
		||||
GROUP_NAME=rippled-reporting
 | 
			
		||||
 | 
			
		||||
getent passwd $USER_NAME &>/dev/null || useradd -r $USER_NAME
 | 
			
		||||
getent group $GROUP_NAME &>/dev/null || groupadd $GROUP_NAME
 | 
			
		||||
 | 
			
		||||
chown -R $USER_NAME:$GROUP_NAME /var/log/rippled-reporting/
 | 
			
		||||
chown -R $USER_NAME:$GROUP_NAME /var/lib/rippled-reporting/
 | 
			
		||||
chown -R $USER_NAME:$GROUP_NAME %{_prefix}/
 | 
			
		||||
 | 
			
		||||
chmod 755 /var/log/rippled-reporting/
 | 
			
		||||
chmod 755 /var/lib/rippled-reporting/
 | 
			
		||||
chmod -x /usr/lib/systemd/system/rippled-reporting.service
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
%files
 | 
			
		||||
%define _prefix /opt/ripple
 | 
			
		||||
%doc rippled/README.md rippled/LICENSE.md
 | 
			
		||||
%{_bindir}/rippled
 | 
			
		||||
/usr/local/bin/rippled
 | 
			
		||||
%{_bindir}/update-rippled.sh
 | 
			
		||||
%{_bindir}/getRippledInfo
 | 
			
		||||
%{_prefix}/etc/update-rippled-cron
 | 
			
		||||
%{_bindir}/validator-keys
 | 
			
		||||
%config(noreplace) %{_prefix}/etc/rippled.cfg
 | 
			
		||||
%config(noreplace) /etc/opt/ripple/rippled.cfg
 | 
			
		||||
%config(noreplace) %{_prefix}/etc/validators.txt
 | 
			
		||||
%config(noreplace) /etc/opt/ripple/validators.txt
 | 
			
		||||
%config(noreplace) /etc/logrotate.d/rippled
 | 
			
		||||
%config(noreplace) /usr/lib/systemd/system/rippled.service
 | 
			
		||||
%config(noreplace) /usr/lib/systemd/system-preset/50-rippled.preset
 | 
			
		||||
 | 
			
		||||
%dir /var/log/rippled/
 | 
			
		||||
%dir /var/lib/rippled/
 | 
			
		||||
 | 
			
		||||
%files devel
 | 
			
		||||
%{_prefix}/include
 | 
			
		||||
%{_prefix}/lib/*.a
 | 
			
		||||
%{_prefix}/lib/cmake/ripple
 | 
			
		||||
 | 
			
		||||
%files reporting
 | 
			
		||||
%define _prefix /opt/rippled-reporting
 | 
			
		||||
%doc rippled/README.md rippled/LICENSE.md
 | 
			
		||||
 | 
			
		||||
%{_bindir}/rippled-reporting
 | 
			
		||||
/usr/local/bin/rippled-reporting
 | 
			
		||||
%config(noreplace) /etc/opt/rippled-reporting/rippled-reporting.cfg
 | 
			
		||||
%config(noreplace) %{_prefix}/etc/rippled-reporting.cfg
 | 
			
		||||
%config(noreplace) %{_prefix}/etc/validators.txt
 | 
			
		||||
%config(noreplace) /etc/opt/rippled-reporting/validators.txt
 | 
			
		||||
%config(noreplace) /usr/lib/systemd/system/rippled-reporting.service
 | 
			
		||||
%config(noreplace) /usr/lib/systemd/system-preset/50-rippled-reporting.preset
 | 
			
		||||
%dir /var/log/rippled-reporting/
 | 
			
		||||
%dir /var/lib/rippled-reporting/
 | 
			
		||||
%{_bindir}/update-rippled-reporting.sh
 | 
			
		||||
%{_bindir}/getRippledReportingInfo
 | 
			
		||||
%{_prefix}/etc/update-rippled-reporting-cron
 | 
			
		||||
%config(noreplace) /etc/logrotate.d/rippled-reporting
 | 
			
		||||
 | 
			
		||||
%changelog
 | 
			
		||||
* Wed Aug 28 2019 Mike Ellery <mellery451@gmail.com>
 | 
			
		||||
- Switch to subproject build for validator-keys
 | 
			
		||||
 | 
			
		||||
* Wed May 15 2019 Mike Ellery <mellery451@gmail.com>
 | 
			
		||||
- Make validator-keys use local rippled build for core lib
 | 
			
		||||
 | 
			
		||||
* Wed Aug 01 2018 Mike Ellery <mellery451@gmail.com>
 | 
			
		||||
- add devel package for signing library
 | 
			
		||||
 | 
			
		||||
* Thu Jun 02 2016 Brandon Wilson <bwilson@ripple.com>
 | 
			
		||||
- Install validators.txt
 | 
			
		||||
@@ -1,37 +0,0 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
set -e
 | 
			
		||||
 | 
			
		||||
IFS=. read cm_maj cm_min cm_rel <<<"$1"
 | 
			
		||||
: ${cm_rel:-0}
 | 
			
		||||
CMAKE_ROOT=${2:-"${HOME}/cmake"}
 | 
			
		||||
 | 
			
		||||
function cmake_version ()
 | 
			
		||||
{
 | 
			
		||||
    if [[ -d ${CMAKE_ROOT} ]] ; then
 | 
			
		||||
        local perms=$(test $(uname) = "Linux" && echo "/111" || echo "+111")
 | 
			
		||||
        local installed=$(find ${CMAKE_ROOT} -perm ${perms} -type f -name cmake)
 | 
			
		||||
        if [[ "${installed}" != "" ]] ; then
 | 
			
		||||
            echo "$(${installed} --version | head -1)"
 | 
			
		||||
        fi
 | 
			
		||||
    fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
installed=$(cmake_version)
 | 
			
		||||
if [[ "${installed}" != "" && ${installed} =~ ${cm_maj}.${cm_min}.${cm_rel} ]] ; then
 | 
			
		||||
    echo "cmake already installed: ${installed}"
 | 
			
		||||
    exit
 | 
			
		||||
fi
 | 
			
		||||
# From CMake 20+ "Linux" is lowercase so using `uname` won't create be the correct path
 | 
			
		||||
if [ ${cm_min} -gt 19 ]; then
 | 
			
		||||
    linux="linux"
 | 
			
		||||
else
 | 
			
		||||
    linux=$(uname)
 | 
			
		||||
fi
 | 
			
		||||
pkgname="cmake-${cm_maj}.${cm_min}.${cm_rel}-${linux}-x86_64.tar.gz"
 | 
			
		||||
tmppkg="/tmp/cmake.tar.gz"
 | 
			
		||||
wget --quiet https://cmake.org/files/v${cm_maj}.${cm_min}/${pkgname} -O ${tmppkg}
 | 
			
		||||
mkdir -p ${CMAKE_ROOT}
 | 
			
		||||
cd ${CMAKE_ROOT}
 | 
			
		||||
tar --strip-components 1 -xf ${tmppkg}
 | 
			
		||||
rm -f ${tmppkg}
 | 
			
		||||
echo "installed: $(cmake_version)"
 | 
			
		||||
@@ -1,15 +0,0 @@
 | 
			
		||||
/var/log/rippled/*.log {
 | 
			
		||||
  daily
 | 
			
		||||
  minsize 200M
 | 
			
		||||
  rotate 7
 | 
			
		||||
  nocreate
 | 
			
		||||
  missingok
 | 
			
		||||
  notifempty
 | 
			
		||||
  compress
 | 
			
		||||
  compresscmd /usr/bin/nice
 | 
			
		||||
  compressoptions -n19 ionice -c3 gzip
 | 
			
		||||
  compressext .gz
 | 
			
		||||
  postrotate
 | 
			
		||||
    /opt/ripple/bin/rippled --conf /opt/ripple/etc/rippled.cfg logrotate
 | 
			
		||||
  endscript
 | 
			
		||||
}
 | 
			
		||||
@@ -1,15 +0,0 @@
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Ripple Daemon
 | 
			
		||||
After=network-online.target
 | 
			
		||||
Wants=network-online.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
Type=simple
 | 
			
		||||
ExecStart=/opt/rippled-reporting/bin/rippled-reporting --silent --conf /etc/opt/rippled-reporting/rippled-reporting.cfg
 | 
			
		||||
Restart=on-failure
 | 
			
		||||
User=rippled-reporting
 | 
			
		||||
Group=rippled-reporting
 | 
			
		||||
LimitNOFILE=65536
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
@@ -1,15 +0,0 @@
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Ripple Daemon
 | 
			
		||||
After=network-online.target
 | 
			
		||||
Wants=network-online.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
Type=simple
 | 
			
		||||
ExecStart=/opt/ripple/bin/rippled --net --silent --conf /etc/opt/ripple/rippled.cfg
 | 
			
		||||
Restart=on-failure
 | 
			
		||||
User=rippled
 | 
			
		||||
Group=rippled
 | 
			
		||||
LimitNOFILE=65536
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
@@ -1,10 +0,0 @@
 | 
			
		||||
# For automatic updates, symlink this file to /etc/cron.d/
 | 
			
		||||
# Do not remove the newline at the end of this cron script
 | 
			
		||||
 | 
			
		||||
# bash required for use of RANDOM below.
 | 
			
		||||
SHELL=/bin/bash
 | 
			
		||||
PATH=/sbin;/bin;/usr/sbin;/usr/bin
 | 
			
		||||
 | 
			
		||||
# invoke check/update script with random delay up to 59 mins
 | 
			
		||||
0 * * * * root sleep $((RANDOM*3540/32768)) && /opt/ripple/bin/update-rippled.sh
 | 
			
		||||
 | 
			
		||||
@@ -1,65 +0,0 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# auto-update script for rippled daemon
 | 
			
		||||
 | 
			
		||||
# Check for sudo/root permissions
 | 
			
		||||
if [[ $(id -u) -ne 0 ]] ; then
 | 
			
		||||
   echo "This update script must be run as root or sudo"
 | 
			
		||||
   exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
LOCKDIR=/tmp/rippleupdate.lock
 | 
			
		||||
UPDATELOG=/var/log/rippled/update.log
 | 
			
		||||
 | 
			
		||||
function cleanup {
 | 
			
		||||
  # If this directory isn't removed, future updates will fail.
 | 
			
		||||
  rmdir $LOCKDIR
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Use mkdir to check if process is already running. mkdir is atomic, as against file create.
 | 
			
		||||
if ! mkdir $LOCKDIR 2>/dev/null; then
 | 
			
		||||
  echo $(date -u) "lockdir exists - won't proceed." >> $UPDATELOG
 | 
			
		||||
  exit 1
 | 
			
		||||
fi
 | 
			
		||||
trap cleanup EXIT
 | 
			
		||||
 | 
			
		||||
source /etc/os-release
 | 
			
		||||
can_update=false
 | 
			
		||||
 | 
			
		||||
if [[ "$ID" == "ubuntu" || "$ID" == "debian" ]] ; then
 | 
			
		||||
  # Silent update
 | 
			
		||||
  apt-get update -qq
 | 
			
		||||
 | 
			
		||||
  # The next line is an "awk"ward way to check if the package needs to be updated.
 | 
			
		||||
  RIPPLE=$(apt-get install -s --only-upgrade rippled | awk '/^Inst/ { print $2 }')
 | 
			
		||||
  test "$RIPPLE" == "rippled" && can_update=true
 | 
			
		||||
 | 
			
		||||
  function apply_update {
 | 
			
		||||
    apt-get install rippled -qq
 | 
			
		||||
  }
 | 
			
		||||
elif [[ "$ID" == "fedora" || "$ID" == "centos" || "$ID" == "rhel" || "$ID" == "scientific" ]] ; then
 | 
			
		||||
  RIPPLE_REPO=${RIPPLE_REPO-stable}
 | 
			
		||||
  yum --disablerepo=* --enablerepo=ripple-$RIPPLE_REPO clean expire-cache
 | 
			
		||||
 | 
			
		||||
  yum check-update -q --enablerepo=ripple-$RIPPLE_REPO rippled || can_update=true
 | 
			
		||||
 | 
			
		||||
  function apply_update {
 | 
			
		||||
    yum update -y --enablerepo=ripple-$RIPPLE_REPO rippled
 | 
			
		||||
  }
 | 
			
		||||
else
 | 
			
		||||
  echo "unrecognized distro!"
 | 
			
		||||
  exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Do the actual update and restart the service after reloading systemctl daemon.
 | 
			
		||||
if [ "$can_update" = true ] ; then
 | 
			
		||||
  exec 3>&1 1>>${UPDATELOG} 2>&1
 | 
			
		||||
  set -e
 | 
			
		||||
  apply_update
 | 
			
		||||
  systemctl daemon-reload
 | 
			
		||||
  systemctl restart rippled.service
 | 
			
		||||
  echo $(date -u) "rippled daemon updated."
 | 
			
		||||
else
 | 
			
		||||
  echo $(date -u) "no updates available" >> $UPDATELOG
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
@@ -1,20 +0,0 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
function error {
 | 
			
		||||
    echo $1
 | 
			
		||||
    exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cd /opt/rippled_bld/pkg/rippled
 | 
			
		||||
export RIPPLED_VERSION=$(egrep -i -o "\b(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(-[0-9a-z\-]+(\.[0-9a-z\-]+)*)?(\+[0-9a-z\-]+(\.[0-9a-z\-]+)*)?\b" src/ripple/protocol/impl/BuildInfo.cpp)
 | 
			
		||||
 | 
			
		||||
: ${PKG_OUTDIR:=/opt/rippled_bld/pkg/out}
 | 
			
		||||
export PKG_OUTDIR
 | 
			
		||||
if [ ! -d ${PKG_OUTDIR} ]; then
 | 
			
		||||
    error "${PKG_OUTDIR} is not mounted"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ -x ${OPENSSL_ROOT}/bin/openssl ]; then
 | 
			
		||||
    LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${OPENSSL_ROOT}/lib ${OPENSSL_ROOT}/bin/openssl version -a
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
@@ -1,22 +0,0 @@
 | 
			
		||||
ARG DIST_TAG=18.04
 | 
			
		||||
FROM ubuntu:$DIST_TAG
 | 
			
		||||
ARG GIT_COMMIT=unknown
 | 
			
		||||
ARG CI_USE=false
 | 
			
		||||
LABEL git-commit=$GIT_COMMIT
 | 
			
		||||
 | 
			
		||||
WORKDIR /root
 | 
			
		||||
COPY ubuntu-builder/ubuntu_setup.sh .
 | 
			
		||||
COPY ubuntu-builder/ubuntu_setup2.sh .
 | 
			
		||||
 | 
			
		||||
RUN ./ubuntu_setup.sh && rm ubuntu_setup.sh
 | 
			
		||||
 | 
			
		||||
RUN ./ubuntu_setup2.sh && rm ubuntu_setup2.sh
 | 
			
		||||
 | 
			
		||||
COPY ubuntu-builder/ubuntu_setup3.sh .
 | 
			
		||||
RUN ./ubuntu_setup3.sh && rm ubuntu_setup3.sh
 | 
			
		||||
 | 
			
		||||
RUN mkdir -m 777 -p /opt/rippled_bld/pkg/
 | 
			
		||||
WORKDIR /opt/rippled_bld/pkg
 | 
			
		||||
 | 
			
		||||
COPY packaging/dpkg/build_dpkg.sh ./
 | 
			
		||||
CMD ./build_dpkg.sh
 | 
			
		||||
@@ -1,47 +0,0 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
set -o errexit
 | 
			
		||||
set -o nounset
 | 
			
		||||
set -o xtrace
 | 
			
		||||
 | 
			
		||||
# Parameters
 | 
			
		||||
 | 
			
		||||
gcc_version=${GCC_VERSION:-11}
 | 
			
		||||
 | 
			
		||||
export DEBIAN_FRONTEND=noninteractive
 | 
			
		||||
 | 
			
		||||
apt update
 | 
			
		||||
# Iteratively build the list of packages to install so that we can interleave
 | 
			
		||||
# the lines with comments explaining their inclusion.
 | 
			
		||||
dependencies=''
 | 
			
		||||
# - for add-apt-repository
 | 
			
		||||
dependencies+=' software-properties-common'
 | 
			
		||||
# - to download CMake
 | 
			
		||||
dependencies+=' curl'
 | 
			
		||||
# - to build CMake
 | 
			
		||||
dependencies+=' libssl-dev'
 | 
			
		||||
# - for Python
 | 
			
		||||
dependencies+=' libbz2-dev liblzma-dev libsqlite3-dev'
 | 
			
		||||
# - to download rippled
 | 
			
		||||
dependencies+=' git'
 | 
			
		||||
# - CMake generators (but not CMake itself)
 | 
			
		||||
dependencies+=' make ninja-build'
 | 
			
		||||
apt-get install --yes ${dependencies}
 | 
			
		||||
 | 
			
		||||
add-apt-repository --yes ppa:ubuntu-toolchain-r/test
 | 
			
		||||
apt-get install --yes gcc-${gcc_version} g++-${gcc_version}
 | 
			
		||||
apt-get install --yes build-essential libssl-dev zlib1g-dev \
 | 
			
		||||
libbz2-dev libreadline-dev libsqlite3-dev curl \
 | 
			
		||||
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
 | 
			
		||||
 | 
			
		||||
# Give us nice unversioned aliases for gcc and company.
 | 
			
		||||
update-alternatives --install \
 | 
			
		||||
  /usr/bin/gcc gcc /usr/bin/gcc-${gcc_version} 100 \
 | 
			
		||||
  --slave /usr/bin/g++ g++ /usr/bin/g++-${gcc_version} \
 | 
			
		||||
  --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-${gcc_version} \
 | 
			
		||||
  --slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-${gcc_version} \
 | 
			
		||||
  --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-${gcc_version} \
 | 
			
		||||
  --slave /usr/bin/gcov gcov /usr/bin/gcov-${gcc_version} \
 | 
			
		||||
  --slave /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-dump-${gcc_version} \
 | 
			
		||||
  --slave /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-tool-${gcc_version}
 | 
			
		||||
update-alternatives --auto gcc
 | 
			
		||||
@@ -1,49 +0,0 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
set -o errexit
 | 
			
		||||
set -o nounset
 | 
			
		||||
set -o xtrace
 | 
			
		||||
 | 
			
		||||
# Parameters
 | 
			
		||||
 | 
			
		||||
gcc_version=${GCC_VERSION:-11}
 | 
			
		||||
cmake_version=${CMAKE_VERSION:-3.25.1}
 | 
			
		||||
cmake_sha256=1c511d09516af493694ed9baf13c55947a36389674d657a2d5e0ccedc6b291d8
 | 
			
		||||
conan_version=${CONAN_VERSION:-1.60}
 | 
			
		||||
 | 
			
		||||
curl https://pyenv.run | bash
 | 
			
		||||
export PYENV_ROOT="$HOME/.pyenv"
 | 
			
		||||
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
 | 
			
		||||
eval "$(pyenv init -)"
 | 
			
		||||
 | 
			
		||||
pyenv install 3.11.2
 | 
			
		||||
pyenv global 3.11.2
 | 
			
		||||
 | 
			
		||||
# Download and unpack CMake.
 | 
			
		||||
cmake_slug="cmake-${cmake_version}"
 | 
			
		||||
cmake_archive="${cmake_slug}.tar.gz"
 | 
			
		||||
curl --location --remote-name \
 | 
			
		||||
  "https://github.com/Kitware/CMake/releases/download/v${cmake_version}/${cmake_archive}"
 | 
			
		||||
echo "${cmake_sha256}  ${cmake_archive}" | sha256sum --check
 | 
			
		||||
tar -xzf ${cmake_archive}
 | 
			
		||||
rm ${cmake_archive}
 | 
			
		||||
 | 
			
		||||
# Build and install CMake.
 | 
			
		||||
cd ${cmake_slug}
 | 
			
		||||
./bootstrap --parallel=$(nproc)
 | 
			
		||||
make --jobs $(nproc)
 | 
			
		||||
make install
 | 
			
		||||
cd ..
 | 
			
		||||
rm --recursive --force ${cmake_slug}
 | 
			
		||||
 | 
			
		||||
# Install Conan.
 | 
			
		||||
pip install --upgrade pip
 | 
			
		||||
pip install conan==${conan_version}
 | 
			
		||||
 | 
			
		||||
conan profile new --detect gcc
 | 
			
		||||
conan profile update settings.compiler=gcc gcc
 | 
			
		||||
conan profile update settings.compiler.version=${gcc_version} gcc
 | 
			
		||||
conan profile update settings.compiler.libcxx=libstdc++11 gcc
 | 
			
		||||
conan profile update settings.compiler.cppstd=20 gcc
 | 
			
		||||
conan profile update env.CC=/usr/bin/gcc gcc
 | 
			
		||||
conan profile update env.CXX=/usr/bin/g++ gcc
 | 
			
		||||
@@ -1,7 +0,0 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
set -o errexit
 | 
			
		||||
set -o nounset
 | 
			
		||||
set -o xtrace
 | 
			
		||||
 | 
			
		||||
apt-get install --yes build-essential fakeroot devscripts cmake debhelper dh-systemd
 | 
			
		||||
@@ -13,12 +13,15 @@ then
 | 
			
		||||
  git clean -ix
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Ensure all sorting is ASCII-order consistently across platforms.
 | 
			
		||||
export LANG=C
 | 
			
		||||
 | 
			
		||||
rm -rfv results
 | 
			
		||||
mkdir results
 | 
			
		||||
includes="$( pwd )/results/rawincludes.txt"
 | 
			
		||||
pushd ../..
 | 
			
		||||
echo Raw includes:
 | 
			
		||||
grep -r '#include.*/.*\.h' src/ripple/ src/test/ | \
 | 
			
		||||
grep -r '^[ ]*#include.*/.*\.h' include src | \
 | 
			
		||||
    grep -v boost | tee ${includes}
 | 
			
		||||
popd
 | 
			
		||||
pushd results
 | 
			
		||||
 
 | 
			
		||||
@@ -1,51 +1,42 @@
 | 
			
		||||
Loop: ripple.app ripple.core
 | 
			
		||||
  ripple.app > ripple.core
 | 
			
		||||
 | 
			
		||||
Loop: ripple.app ripple.ledger
 | 
			
		||||
  ripple.app > ripple.ledger
 | 
			
		||||
 | 
			
		||||
Loop: ripple.app ripple.net
 | 
			
		||||
  ripple.app > ripple.net
 | 
			
		||||
 | 
			
		||||
Loop: ripple.app ripple.nodestore
 | 
			
		||||
  ripple.app > ripple.nodestore
 | 
			
		||||
 | 
			
		||||
Loop: ripple.app ripple.overlay
 | 
			
		||||
  ripple.overlay ~= ripple.app
 | 
			
		||||
 | 
			
		||||
Loop: ripple.app ripple.peerfinder
 | 
			
		||||
  ripple.app > ripple.peerfinder
 | 
			
		||||
 | 
			
		||||
Loop: ripple.app ripple.rpc
 | 
			
		||||
  ripple.rpc > ripple.app
 | 
			
		||||
 | 
			
		||||
Loop: ripple.app ripple.shamap
 | 
			
		||||
  ripple.app > ripple.shamap
 | 
			
		||||
 | 
			
		||||
Loop: ripple.basics ripple.core
 | 
			
		||||
  ripple.core > ripple.basics
 | 
			
		||||
 | 
			
		||||
Loop: ripple.basics ripple.json
 | 
			
		||||
  ripple.json ~= ripple.basics
 | 
			
		||||
 | 
			
		||||
Loop: ripple.basics ripple.protocol
 | 
			
		||||
  ripple.protocol > ripple.basics
 | 
			
		||||
 | 
			
		||||
Loop: ripple.core ripple.net
 | 
			
		||||
  ripple.net > ripple.core
 | 
			
		||||
 | 
			
		||||
Loop: ripple.net ripple.rpc
 | 
			
		||||
  ripple.rpc > ripple.net
 | 
			
		||||
 | 
			
		||||
Loop: ripple.nodestore ripple.overlay
 | 
			
		||||
  ripple.overlay ~= ripple.nodestore
 | 
			
		||||
 | 
			
		||||
Loop: ripple.overlay ripple.rpc
 | 
			
		||||
  ripple.rpc ~= ripple.overlay
 | 
			
		||||
 | 
			
		||||
Loop: test.jtx test.toplevel
 | 
			
		||||
  test.toplevel > test.jtx
 | 
			
		||||
 | 
			
		||||
Loop: test.jtx test.unit_test
 | 
			
		||||
  test.unit_test == test.jtx
 | 
			
		||||
 | 
			
		||||
Loop: xrpld.app xrpld.core
 | 
			
		||||
  xrpld.app > xrpld.core
 | 
			
		||||
 | 
			
		||||
Loop: xrpld.app xrpld.ledger
 | 
			
		||||
  xrpld.app > xrpld.ledger
 | 
			
		||||
 | 
			
		||||
Loop: xrpld.app xrpld.net
 | 
			
		||||
  xrpld.app > xrpld.net
 | 
			
		||||
 | 
			
		||||
Loop: xrpld.app xrpld.overlay
 | 
			
		||||
  xrpld.overlay > xrpld.app
 | 
			
		||||
 | 
			
		||||
Loop: xrpld.app xrpld.peerfinder
 | 
			
		||||
  xrpld.peerfinder ~= xrpld.app
 | 
			
		||||
 | 
			
		||||
Loop: xrpld.app xrpld.rpc
 | 
			
		||||
  xrpld.rpc > xrpld.app
 | 
			
		||||
 | 
			
		||||
Loop: xrpld.app xrpld.shamap
 | 
			
		||||
  xrpld.app > xrpld.shamap
 | 
			
		||||
 | 
			
		||||
Loop: xrpld.core xrpld.net
 | 
			
		||||
  xrpld.net > xrpld.core
 | 
			
		||||
 | 
			
		||||
Loop: xrpld.core xrpld.perflog
 | 
			
		||||
  xrpld.perflog == xrpld.core
 | 
			
		||||
 | 
			
		||||
Loop: xrpld.net xrpld.rpc
 | 
			
		||||
  xrpld.rpc ~= xrpld.net
 | 
			
		||||
 | 
			
		||||
Loop: xrpld.overlay xrpld.rpc
 | 
			
		||||
  xrpld.rpc ~= xrpld.overlay
 | 
			
		||||
 | 
			
		||||
Loop: xrpld.perflog xrpld.rpc
 | 
			
		||||
  xrpld.rpc ~= xrpld.perflog
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,230 +1,197 @@
 | 
			
		||||
ripple.app > ripple.basics
 | 
			
		||||
ripple.app > ripple.beast
 | 
			
		||||
ripple.app > ripple.conditions
 | 
			
		||||
ripple.app > ripple.consensus
 | 
			
		||||
ripple.app > ripple.crypto
 | 
			
		||||
ripple.app > ripple.json
 | 
			
		||||
ripple.app > ripple.protocol
 | 
			
		||||
ripple.app > ripple.resource
 | 
			
		||||
ripple.app > test.unit_test
 | 
			
		||||
ripple.basics > ripple.beast
 | 
			
		||||
ripple.conditions > ripple.basics
 | 
			
		||||
ripple.conditions > ripple.protocol
 | 
			
		||||
ripple.consensus > ripple.basics
 | 
			
		||||
ripple.consensus > ripple.beast
 | 
			
		||||
ripple.consensus > ripple.json
 | 
			
		||||
ripple.consensus > ripple.protocol
 | 
			
		||||
ripple.core > ripple.beast
 | 
			
		||||
ripple.core > ripple.json
 | 
			
		||||
ripple.core > ripple.protocol
 | 
			
		||||
ripple.crypto > ripple.basics
 | 
			
		||||
ripple.json > ripple.beast
 | 
			
		||||
ripple.ledger > ripple.basics
 | 
			
		||||
ripple.ledger > ripple.beast
 | 
			
		||||
ripple.ledger > ripple.core
 | 
			
		||||
ripple.ledger > ripple.json
 | 
			
		||||
ripple.ledger > ripple.protocol
 | 
			
		||||
ripple.net > ripple.basics
 | 
			
		||||
ripple.net > ripple.beast
 | 
			
		||||
ripple.net > ripple.json
 | 
			
		||||
ripple.net > ripple.protocol
 | 
			
		||||
ripple.net > ripple.resource
 | 
			
		||||
ripple.nodestore > ripple.basics
 | 
			
		||||
ripple.nodestore > ripple.beast
 | 
			
		||||
ripple.nodestore > ripple.core
 | 
			
		||||
ripple.nodestore > ripple.json
 | 
			
		||||
ripple.nodestore > ripple.protocol
 | 
			
		||||
ripple.nodestore > ripple.unity
 | 
			
		||||
ripple.overlay > ripple.basics
 | 
			
		||||
ripple.overlay > ripple.beast
 | 
			
		||||
ripple.overlay > ripple.core
 | 
			
		||||
ripple.overlay > ripple.json
 | 
			
		||||
ripple.overlay > ripple.peerfinder
 | 
			
		||||
ripple.overlay > ripple.protocol
 | 
			
		||||
ripple.overlay > ripple.resource
 | 
			
		||||
ripple.overlay > ripple.server
 | 
			
		||||
ripple.peerfinder > ripple.basics
 | 
			
		||||
ripple.peerfinder > ripple.beast
 | 
			
		||||
ripple.peerfinder > ripple.core
 | 
			
		||||
ripple.peerfinder > ripple.protocol
 | 
			
		||||
ripple.perflog > ripple.basics
 | 
			
		||||
ripple.perflog > ripple.beast
 | 
			
		||||
ripple.perflog > ripple.core
 | 
			
		||||
ripple.perflog > ripple.json
 | 
			
		||||
ripple.perflog > ripple.nodestore
 | 
			
		||||
ripple.perflog > ripple.protocol
 | 
			
		||||
ripple.perflog > ripple.rpc
 | 
			
		||||
ripple.protocol > ripple.beast
 | 
			
		||||
ripple.protocol > ripple.crypto
 | 
			
		||||
ripple.protocol > ripple.json
 | 
			
		||||
ripple.resource > ripple.basics
 | 
			
		||||
ripple.resource > ripple.beast
 | 
			
		||||
ripple.resource > ripple.json
 | 
			
		||||
ripple.resource > ripple.protocol
 | 
			
		||||
ripple.rpc > ripple.basics
 | 
			
		||||
ripple.rpc > ripple.beast
 | 
			
		||||
ripple.rpc > ripple.core
 | 
			
		||||
ripple.rpc > ripple.crypto
 | 
			
		||||
ripple.rpc > ripple.json
 | 
			
		||||
ripple.rpc > ripple.ledger
 | 
			
		||||
ripple.rpc > ripple.nodestore
 | 
			
		||||
ripple.rpc > ripple.protocol
 | 
			
		||||
ripple.rpc > ripple.resource
 | 
			
		||||
ripple.rpc > ripple.server
 | 
			
		||||
ripple.rpc > ripple.shamap
 | 
			
		||||
ripple.server > ripple.basics
 | 
			
		||||
ripple.server > ripple.beast
 | 
			
		||||
ripple.server > ripple.crypto
 | 
			
		||||
ripple.server > ripple.json
 | 
			
		||||
ripple.server > ripple.protocol
 | 
			
		||||
ripple.shamap > ripple.basics
 | 
			
		||||
ripple.shamap > ripple.beast
 | 
			
		||||
ripple.shamap > ripple.crypto
 | 
			
		||||
ripple.shamap > ripple.nodestore
 | 
			
		||||
ripple.shamap > ripple.protocol
 | 
			
		||||
test.app > ripple.app
 | 
			
		||||
test.app > ripple.basics
 | 
			
		||||
test.app > ripple.beast
 | 
			
		||||
test.app > ripple.core
 | 
			
		||||
test.app > ripple.json
 | 
			
		||||
test.app > ripple.ledger
 | 
			
		||||
test.app > ripple.overlay
 | 
			
		||||
test.app > ripple.protocol
 | 
			
		||||
test.app > ripple.resource
 | 
			
		||||
test.app > ripple.rpc
 | 
			
		||||
libxrpl.basics > xrpl.basics
 | 
			
		||||
libxrpl.crypto > xrpl.basics
 | 
			
		||||
libxrpl.json > xrpl.basics
 | 
			
		||||
libxrpl.json > xrpl.json
 | 
			
		||||
libxrpl.protocol > xrpl.basics
 | 
			
		||||
libxrpl.protocol > xrpl.json
 | 
			
		||||
libxrpl.protocol > xrpl.protocol
 | 
			
		||||
libxrpl.resource > xrpl.basics
 | 
			
		||||
libxrpl.resource > xrpl.json
 | 
			
		||||
libxrpl.resource > xrpl.resource
 | 
			
		||||
libxrpl.server > xrpl.basics
 | 
			
		||||
libxrpl.server > xrpl.json
 | 
			
		||||
libxrpl.server > xrpl.protocol
 | 
			
		||||
libxrpl.server > xrpl.server
 | 
			
		||||
test.app > test.jtx
 | 
			
		||||
test.app > test.rpc
 | 
			
		||||
test.app > test.toplevel
 | 
			
		||||
test.app > test.unit_test
 | 
			
		||||
test.basics > ripple.basics
 | 
			
		||||
test.basics > ripple.beast
 | 
			
		||||
test.basics > ripple.json
 | 
			
		||||
test.basics > ripple.protocol
 | 
			
		||||
test.basics > ripple.rpc
 | 
			
		||||
test.app > xrpl.basics
 | 
			
		||||
test.app > xrpld.app
 | 
			
		||||
test.app > xrpld.core
 | 
			
		||||
test.app > xrpld.ledger
 | 
			
		||||
test.app > xrpld.nodestore
 | 
			
		||||
test.app > xrpld.overlay
 | 
			
		||||
test.app > xrpld.rpc
 | 
			
		||||
test.app > xrpl.json
 | 
			
		||||
test.app > xrpl.protocol
 | 
			
		||||
test.app > xrpl.resource
 | 
			
		||||
test.basics > test.jtx
 | 
			
		||||
test.basics > test.unit_test
 | 
			
		||||
test.beast > ripple.basics
 | 
			
		||||
test.beast > ripple.beast
 | 
			
		||||
test.conditions > ripple.basics
 | 
			
		||||
test.conditions > ripple.beast
 | 
			
		||||
test.conditions > ripple.conditions
 | 
			
		||||
test.consensus > ripple.app
 | 
			
		||||
test.consensus > ripple.basics
 | 
			
		||||
test.consensus > ripple.beast
 | 
			
		||||
test.consensus > ripple.consensus
 | 
			
		||||
test.consensus > ripple.ledger
 | 
			
		||||
test.basics > xrpl.basics
 | 
			
		||||
test.basics > xrpld.perflog
 | 
			
		||||
test.basics > xrpld.rpc
 | 
			
		||||
test.basics > xrpl.json
 | 
			
		||||
test.basics > xrpl.protocol
 | 
			
		||||
test.beast > xrpl.basics
 | 
			
		||||
test.conditions > xrpl.basics
 | 
			
		||||
test.conditions > xrpld.conditions
 | 
			
		||||
test.consensus > test.csf
 | 
			
		||||
test.consensus > test.toplevel
 | 
			
		||||
test.consensus > test.unit_test
 | 
			
		||||
test.core > ripple.basics
 | 
			
		||||
test.core > ripple.beast
 | 
			
		||||
test.core > ripple.core
 | 
			
		||||
test.core > ripple.crypto
 | 
			
		||||
test.core > ripple.json
 | 
			
		||||
test.core > ripple.server
 | 
			
		||||
test.consensus > xrpl.basics
 | 
			
		||||
test.consensus > xrpld.app
 | 
			
		||||
test.consensus > xrpld.consensus
 | 
			
		||||
test.consensus > xrpld.ledger
 | 
			
		||||
test.consensus > xrpl.json
 | 
			
		||||
test.core > test.jtx
 | 
			
		||||
test.core > test.toplevel
 | 
			
		||||
test.core > test.unit_test
 | 
			
		||||
test.csf > ripple.basics
 | 
			
		||||
test.csf > ripple.beast
 | 
			
		||||
test.csf > ripple.consensus
 | 
			
		||||
test.csf > ripple.json
 | 
			
		||||
test.csf > ripple.protocol
 | 
			
		||||
test.json > ripple.beast
 | 
			
		||||
test.json > ripple.json
 | 
			
		||||
test.json > ripple.rpc
 | 
			
		||||
test.core > xrpl.basics
 | 
			
		||||
test.core > xrpld.core
 | 
			
		||||
test.core > xrpld.perflog
 | 
			
		||||
test.core > xrpl.json
 | 
			
		||||
test.core > xrpl.server
 | 
			
		||||
test.csf > xrpl.basics
 | 
			
		||||
test.csf > xrpld.consensus
 | 
			
		||||
test.csf > xrpl.json
 | 
			
		||||
test.csf > xrpl.protocol
 | 
			
		||||
test.json > test.jtx
 | 
			
		||||
test.jtx > ripple.app
 | 
			
		||||
test.jtx > ripple.basics
 | 
			
		||||
test.jtx > ripple.beast
 | 
			
		||||
test.jtx > ripple.consensus
 | 
			
		||||
test.jtx > ripple.core
 | 
			
		||||
test.jtx > ripple.json
 | 
			
		||||
test.jtx > ripple.ledger
 | 
			
		||||
test.jtx > ripple.net
 | 
			
		||||
test.jtx > ripple.protocol
 | 
			
		||||
test.jtx > ripple.resource
 | 
			
		||||
test.jtx > ripple.rpc
 | 
			
		||||
test.jtx > ripple.server
 | 
			
		||||
test.ledger > ripple.app
 | 
			
		||||
test.ledger > ripple.basics
 | 
			
		||||
test.ledger > ripple.beast
 | 
			
		||||
test.ledger > ripple.core
 | 
			
		||||
test.ledger > ripple.ledger
 | 
			
		||||
test.ledger > ripple.protocol
 | 
			
		||||
test.json > xrpl.json
 | 
			
		||||
test.jtx > xrpl.basics
 | 
			
		||||
test.jtx > xrpld.app
 | 
			
		||||
test.jtx > xrpld.core
 | 
			
		||||
test.jtx > xrpld.ledger
 | 
			
		||||
test.jtx > xrpld.net
 | 
			
		||||
test.jtx > xrpld.rpc
 | 
			
		||||
test.jtx > xrpl.json
 | 
			
		||||
test.jtx > xrpl.protocol
 | 
			
		||||
test.jtx > xrpl.resource
 | 
			
		||||
test.jtx > xrpl.server
 | 
			
		||||
test.ledger > test.jtx
 | 
			
		||||
test.ledger > test.toplevel
 | 
			
		||||
test.net > ripple.net
 | 
			
		||||
test.net > test.jtx
 | 
			
		||||
test.net > test.toplevel
 | 
			
		||||
test.net > test.unit_test
 | 
			
		||||
test.nodestore > ripple.app
 | 
			
		||||
test.nodestore > ripple.basics
 | 
			
		||||
test.nodestore > ripple.beast
 | 
			
		||||
test.nodestore > ripple.core
 | 
			
		||||
test.nodestore > ripple.nodestore
 | 
			
		||||
test.nodestore > ripple.protocol
 | 
			
		||||
test.nodestore > ripple.unity
 | 
			
		||||
test.ledger > xrpl.basics
 | 
			
		||||
test.ledger > xrpld.app
 | 
			
		||||
test.ledger > xrpld.core
 | 
			
		||||
test.ledger > xrpld.ledger
 | 
			
		||||
test.ledger > xrpl.protocol
 | 
			
		||||
test.nodestore > test.jtx
 | 
			
		||||
test.nodestore > test.toplevel
 | 
			
		||||
test.nodestore > test.unit_test
 | 
			
		||||
test.overlay > ripple.app
 | 
			
		||||
test.overlay > ripple.basics
 | 
			
		||||
test.overlay > ripple.beast
 | 
			
		||||
test.overlay > ripple.overlay
 | 
			
		||||
test.overlay > ripple.peerfinder
 | 
			
		||||
test.overlay > ripple.protocol
 | 
			
		||||
test.overlay > ripple.shamap
 | 
			
		||||
test.nodestore > xrpl.basics
 | 
			
		||||
test.nodestore > xrpld.core
 | 
			
		||||
test.nodestore > xrpld.nodestore
 | 
			
		||||
test.nodestore > xrpld.unity
 | 
			
		||||
test.overlay > test.jtx
 | 
			
		||||
test.overlay > test.toplevel
 | 
			
		||||
test.overlay > test.unit_test
 | 
			
		||||
test.peerfinder > ripple.basics
 | 
			
		||||
test.peerfinder > ripple.beast
 | 
			
		||||
test.peerfinder > ripple.core
 | 
			
		||||
test.peerfinder > ripple.peerfinder
 | 
			
		||||
test.peerfinder > ripple.protocol
 | 
			
		||||
test.overlay > xrpl.basics
 | 
			
		||||
test.overlay > xrpld.app
 | 
			
		||||
test.overlay > xrpld.overlay
 | 
			
		||||
test.overlay > xrpld.peerfinder
 | 
			
		||||
test.overlay > xrpld.shamap
 | 
			
		||||
test.overlay > xrpl.protocol
 | 
			
		||||
test.peerfinder > test.beast
 | 
			
		||||
test.peerfinder > test.unit_test
 | 
			
		||||
test.protocol > ripple.basics
 | 
			
		||||
test.protocol > ripple.beast
 | 
			
		||||
test.protocol > ripple.crypto
 | 
			
		||||
test.protocol > ripple.json
 | 
			
		||||
test.protocol > ripple.protocol
 | 
			
		||||
test.peerfinder > xrpl.basics
 | 
			
		||||
test.peerfinder > xrpld.core
 | 
			
		||||
test.peerfinder > xrpld.peerfinder
 | 
			
		||||
test.peerfinder > xrpl.protocol
 | 
			
		||||
test.protocol > test.toplevel
 | 
			
		||||
test.resource > ripple.basics
 | 
			
		||||
test.resource > ripple.beast
 | 
			
		||||
test.resource > ripple.resource
 | 
			
		||||
test.protocol > xrpl.basics
 | 
			
		||||
test.protocol > xrpl.json
 | 
			
		||||
test.protocol > xrpl.protocol
 | 
			
		||||
test.resource > test.unit_test
 | 
			
		||||
test.rpc > ripple.app
 | 
			
		||||
test.rpc > ripple.basics
 | 
			
		||||
test.rpc > ripple.beast
 | 
			
		||||
test.rpc > ripple.core
 | 
			
		||||
test.rpc > ripple.json
 | 
			
		||||
test.rpc > ripple.net
 | 
			
		||||
test.rpc > ripple.nodestore
 | 
			
		||||
test.rpc > ripple.overlay
 | 
			
		||||
test.rpc > ripple.protocol
 | 
			
		||||
test.rpc > ripple.resource
 | 
			
		||||
test.rpc > ripple.rpc
 | 
			
		||||
test.resource > xrpl.basics
 | 
			
		||||
test.resource > xrpl.resource
 | 
			
		||||
test.rpc > test.jtx
 | 
			
		||||
test.rpc > test.nodestore
 | 
			
		||||
test.rpc > test.toplevel
 | 
			
		||||
test.server > ripple.app
 | 
			
		||||
test.server > ripple.basics
 | 
			
		||||
test.server > ripple.beast
 | 
			
		||||
test.server > ripple.core
 | 
			
		||||
test.server > ripple.json
 | 
			
		||||
test.server > ripple.rpc
 | 
			
		||||
test.server > ripple.server
 | 
			
		||||
test.rpc > xrpl.basics
 | 
			
		||||
test.rpc > xrpld.app
 | 
			
		||||
test.rpc > xrpld.core
 | 
			
		||||
test.rpc > xrpld.net
 | 
			
		||||
test.rpc > xrpld.overlay
 | 
			
		||||
test.rpc > xrpld.rpc
 | 
			
		||||
test.rpc > xrpl.json
 | 
			
		||||
test.rpc > xrpl.protocol
 | 
			
		||||
test.rpc > xrpl.resource
 | 
			
		||||
test.server > test.jtx
 | 
			
		||||
test.server > test.toplevel
 | 
			
		||||
test.server > test.unit_test
 | 
			
		||||
test.shamap > ripple.basics
 | 
			
		||||
test.shamap > ripple.beast
 | 
			
		||||
test.shamap > ripple.nodestore
 | 
			
		||||
test.shamap > ripple.protocol
 | 
			
		||||
test.shamap > ripple.shamap
 | 
			
		||||
test.server > xrpl.basics
 | 
			
		||||
test.server > xrpld.app
 | 
			
		||||
test.server > xrpld.core
 | 
			
		||||
test.server > xrpld.rpc
 | 
			
		||||
test.server > xrpl.json
 | 
			
		||||
test.server > xrpl.server
 | 
			
		||||
test.shamap > test.unit_test
 | 
			
		||||
test.toplevel > ripple.json
 | 
			
		||||
test.shamap > xrpl.basics
 | 
			
		||||
test.shamap > xrpld.nodestore
 | 
			
		||||
test.shamap > xrpld.shamap
 | 
			
		||||
test.shamap > xrpl.protocol
 | 
			
		||||
test.toplevel > test.csf
 | 
			
		||||
test.unit_test > ripple.basics
 | 
			
		||||
test.unit_test > ripple.beast
 | 
			
		||||
test.toplevel > xrpl.json
 | 
			
		||||
test.unit_test > xrpl.basics
 | 
			
		||||
tests.libxrpl > xrpl.basics
 | 
			
		||||
xrpl.json > xrpl.basics
 | 
			
		||||
xrpl.protocol > xrpl.basics
 | 
			
		||||
xrpl.protocol > xrpl.json
 | 
			
		||||
xrpl.resource > xrpl.basics
 | 
			
		||||
xrpl.resource > xrpl.json
 | 
			
		||||
xrpl.resource > xrpl.protocol
 | 
			
		||||
xrpl.server > xrpl.basics
 | 
			
		||||
xrpl.server > xrpl.json
 | 
			
		||||
xrpl.server > xrpl.protocol
 | 
			
		||||
xrpld.app > test.unit_test
 | 
			
		||||
xrpld.app > xrpl.basics
 | 
			
		||||
xrpld.app > xrpld.conditions
 | 
			
		||||
xrpld.app > xrpld.consensus
 | 
			
		||||
xrpld.app > xrpld.nodestore
 | 
			
		||||
xrpld.app > xrpld.perflog
 | 
			
		||||
xrpld.app > xrpl.json
 | 
			
		||||
xrpld.app > xrpl.protocol
 | 
			
		||||
xrpld.app > xrpl.resource
 | 
			
		||||
xrpld.conditions > xrpl.basics
 | 
			
		||||
xrpld.conditions > xrpl.protocol
 | 
			
		||||
xrpld.consensus > xrpl.basics
 | 
			
		||||
xrpld.consensus > xrpl.json
 | 
			
		||||
xrpld.consensus > xrpl.protocol
 | 
			
		||||
xrpld.core > xrpl.basics
 | 
			
		||||
xrpld.core > xrpl.json
 | 
			
		||||
xrpld.core > xrpl.protocol
 | 
			
		||||
xrpld.ledger > xrpl.basics
 | 
			
		||||
xrpld.ledger > xrpl.json
 | 
			
		||||
xrpld.ledger > xrpl.protocol
 | 
			
		||||
xrpld.net > xrpl.basics
 | 
			
		||||
xrpld.net > xrpl.json
 | 
			
		||||
xrpld.net > xrpl.protocol
 | 
			
		||||
xrpld.net > xrpl.resource
 | 
			
		||||
xrpld.nodestore > xrpl.basics
 | 
			
		||||
xrpld.nodestore > xrpld.core
 | 
			
		||||
xrpld.nodestore > xrpld.unity
 | 
			
		||||
xrpld.nodestore > xrpl.json
 | 
			
		||||
xrpld.nodestore > xrpl.protocol
 | 
			
		||||
xrpld.overlay > xrpl.basics
 | 
			
		||||
xrpld.overlay > xrpld.core
 | 
			
		||||
xrpld.overlay > xrpld.peerfinder
 | 
			
		||||
xrpld.overlay > xrpld.perflog
 | 
			
		||||
xrpld.overlay > xrpl.json
 | 
			
		||||
xrpld.overlay > xrpl.protocol
 | 
			
		||||
xrpld.overlay > xrpl.resource
 | 
			
		||||
xrpld.overlay > xrpl.server
 | 
			
		||||
xrpld.peerfinder > xrpl.basics
 | 
			
		||||
xrpld.peerfinder > xrpld.core
 | 
			
		||||
xrpld.peerfinder > xrpl.protocol
 | 
			
		||||
xrpld.perflog > xrpl.basics
 | 
			
		||||
xrpld.perflog > xrpl.json
 | 
			
		||||
xrpld.rpc > xrpl.basics
 | 
			
		||||
xrpld.rpc > xrpld.core
 | 
			
		||||
xrpld.rpc > xrpld.ledger
 | 
			
		||||
xrpld.rpc > xrpld.nodestore
 | 
			
		||||
xrpld.rpc > xrpl.json
 | 
			
		||||
xrpld.rpc > xrpl.protocol
 | 
			
		||||
xrpld.rpc > xrpl.resource
 | 
			
		||||
xrpld.rpc > xrpl.server
 | 
			
		||||
xrpld.shamap > xrpl.basics
 | 
			
		||||
xrpld.shamap > xrpld.nodestore
 | 
			
		||||
xrpld.shamap > xrpl.protocol
 | 
			
		||||
 
 | 
			
		||||
@@ -9,23 +9,43 @@ endif()
 | 
			
		||||
 | 
			
		||||
# Fix "unrecognized escape" issues when passing CMAKE_MODULE_PATH on Windows.
 | 
			
		||||
file(TO_CMAKE_PATH "${CMAKE_MODULE_PATH}" CMAKE_MODULE_PATH)
 | 
			
		||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/Builds/CMake")
 | 
			
		||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
 | 
			
		||||
 | 
			
		||||
project(rippled)
 | 
			
		||||
project(xrpl)
 | 
			
		||||
set(CMAKE_CXX_EXTENSIONS OFF)
 | 
			
		||||
set(CMAKE_CXX_STANDARD 20)
 | 
			
		||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
 | 
			
		||||
 | 
			
		||||
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
 | 
			
		||||
    # GCC-specific fixes
 | 
			
		||||
    add_compile_options(-Wno-unknown-pragmas -Wno-subobject-linkage)
 | 
			
		||||
    # -Wno-subobject-linkage can be removed when we upgrade GCC version to at least 13.3
 | 
			
		||||
elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
 | 
			
		||||
    # Clang-specific fixes
 | 
			
		||||
    add_compile_options(-Wno-unknown-warning-option) # Ignore unknown warning options
 | 
			
		||||
elseif(MSVC)
 | 
			
		||||
    # MSVC-specific fixes
 | 
			
		||||
    add_compile_options(/wd4068) # Ignore unknown pragmas
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
# make GIT_COMMIT_HASH define available to all sources
 | 
			
		||||
find_package(Git)
 | 
			
		||||
if(Git_FOUND)
 | 
			
		||||
    execute_process(COMMAND ${GIT_EXECUTABLE} --git-dir=${CMAKE_CURRENT_SOURCE_DIR}/.git describe --always --abbrev=40
 | 
			
		||||
    execute_process(COMMAND ${GIT_EXECUTABLE} --git-dir=${CMAKE_CURRENT_SOURCE_DIR}/.git rev-parse HEAD
 | 
			
		||||
        OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE gch)
 | 
			
		||||
    if(gch)
 | 
			
		||||
        set(GIT_COMMIT_HASH "${gch}")
 | 
			
		||||
        message(STATUS gch: ${GIT_COMMIT_HASH})
 | 
			
		||||
        add_definitions(-DGIT_COMMIT_HASH="${GIT_COMMIT_HASH}")
 | 
			
		||||
    endif()
 | 
			
		||||
 | 
			
		||||
    execute_process(COMMAND ${GIT_EXECUTABLE} --git-dir=${CMAKE_CURRENT_SOURCE_DIR}/.git rev-parse --abbrev-ref HEAD
 | 
			
		||||
        OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE gb)
 | 
			
		||||
    if(gb)
 | 
			
		||||
        set(GIT_BRANCH "${gb}")
 | 
			
		||||
        message(STATUS gb: ${GIT_BRANCH})
 | 
			
		||||
        add_definitions(-DGIT_BRANCH="${GIT_BRANCH}")
 | 
			
		||||
    endif()
 | 
			
		||||
endif() #git
 | 
			
		||||
 | 
			
		||||
if(thread_safety_analysis)
 | 
			
		||||
@@ -45,7 +65,6 @@ endif ()
 | 
			
		||||
include(RippledSanity)
 | 
			
		||||
include(RippledVersion)
 | 
			
		||||
include(RippledSettings)
 | 
			
		||||
include(RippledRelease)
 | 
			
		||||
# this check has to remain in the top-level cmake
 | 
			
		||||
# because of the early return statement
 | 
			
		||||
if (packages_only)
 | 
			
		||||
@@ -71,9 +90,16 @@ set_target_properties(OpenSSL::SSL PROPERTIES
 | 
			
		||||
  INTERFACE_COMPILE_DEFINITIONS OPENSSL_NO_SSL2
 | 
			
		||||
)
 | 
			
		||||
set(SECP256K1_INSTALL TRUE)
 | 
			
		||||
add_subdirectory(src/secp256k1)
 | 
			
		||||
set(SECP256K1_BUILD_BENCHMARK FALSE)
 | 
			
		||||
set(SECP256K1_BUILD_TESTS FALSE)
 | 
			
		||||
set(SECP256K1_BUILD_EXHAUSTIVE_TESTS FALSE)
 | 
			
		||||
set(SECP256K1_BUILD_CTIME_TESTS FALSE)
 | 
			
		||||
set(SECP256K1_BUILD_EXAMPLES FALSE)
 | 
			
		||||
add_subdirectory(external/secp256k1)
 | 
			
		||||
add_library(secp256k1::secp256k1 ALIAS secp256k1)
 | 
			
		||||
add_subdirectory(src/ed25519-donna)
 | 
			
		||||
add_subdirectory(external/ed25519-donna)
 | 
			
		||||
add_subdirectory(external/antithesis-sdk)
 | 
			
		||||
find_package(gRPC REQUIRED)
 | 
			
		||||
find_package(lz4 REQUIRED)
 | 
			
		||||
# Target names with :: are not allowed in a generator expression.
 | 
			
		||||
# We need to pull the include directories and imported location properties
 | 
			
		||||
@@ -81,7 +107,6 @@ find_package(lz4 REQUIRED)
 | 
			
		||||
find_package(LibArchive REQUIRED)
 | 
			
		||||
find_package(SOCI REQUIRED)
 | 
			
		||||
find_package(SQLite3 REQUIRED)
 | 
			
		||||
find_package(Snappy REQUIRED)
 | 
			
		||||
 | 
			
		||||
option(rocksdb "Enable RocksDB" ON)
 | 
			
		||||
if(rocksdb)
 | 
			
		||||
@@ -94,10 +119,10 @@ endif()
 | 
			
		||||
 | 
			
		||||
find_package(nudb REQUIRED)
 | 
			
		||||
find_package(date REQUIRED)
 | 
			
		||||
find_package(xxHash REQUIRED)
 | 
			
		||||
 | 
			
		||||
target_link_libraries(ripple_libs INTERFACE
 | 
			
		||||
  ed25519::ed25519
 | 
			
		||||
  LibArchive::LibArchive
 | 
			
		||||
  lz4::lz4
 | 
			
		||||
  OpenSSL::Crypto
 | 
			
		||||
  OpenSSL::SSL
 | 
			
		||||
@@ -116,24 +141,16 @@ else()
 | 
			
		||||
endif()
 | 
			
		||||
target_link_libraries(ripple_libs INTERFACE ${nudb})
 | 
			
		||||
 | 
			
		||||
if(reporting)
 | 
			
		||||
  find_package(cassandra-cpp-driver REQUIRED)
 | 
			
		||||
  find_package(PostgreSQL REQUIRED)
 | 
			
		||||
  target_link_libraries(ripple_libs INTERFACE
 | 
			
		||||
    cassandra-cpp-driver::cassandra-cpp-driver
 | 
			
		||||
    PostgreSQL::PostgreSQL
 | 
			
		||||
  )
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
if(coverage)
 | 
			
		||||
  include(RippledCov)
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
###
 | 
			
		||||
 | 
			
		||||
set(PROJECT_EXPORT_SET RippleExports)
 | 
			
		||||
include(RippledCore)
 | 
			
		||||
include(deps/Protobuf)
 | 
			
		||||
include(deps/gRPC)
 | 
			
		||||
include(RippledInstall)
 | 
			
		||||
include(RippledMultiConfig)
 | 
			
		||||
include(RippledValidatorKeys)
 | 
			
		||||
 | 
			
		||||
if(tests)
 | 
			
		||||
  include(CTest)
 | 
			
		||||
  add_subdirectory(src/tests/libxrpl)
 | 
			
		||||
endif()
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										864
									
								
								CONTRIBUTING.md
									
									
									
									
									
								
							
							
						
						
									
										864
									
								
								CONTRIBUTING.md
									
									
									
									
									
								
							@@ -5,15 +5,12 @@ XRPL.
 | 
			
		||||
# Contributing
 | 
			
		||||
 | 
			
		||||
We assume you are familiar with the general practice of [making
 | 
			
		||||
contributions on GitHub][1]. This file includes only special
 | 
			
		||||
contributions on GitHub][contrib]. This file includes only special
 | 
			
		||||
instructions specific to this project.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## Before you start
 | 
			
		||||
 | 
			
		||||
In general, contributions should be developed in your personal
 | 
			
		||||
[fork](https://github.com/XRPLF/rippled/fork).
 | 
			
		||||
 | 
			
		||||
The following branches exist in the main project repository:
 | 
			
		||||
 | 
			
		||||
- `develop`: The latest set of unreleased features, and the most common
 | 
			
		||||
@@ -26,9 +23,20 @@ The tip of each branch must be signed. In order for GitHub to sign a
 | 
			
		||||
squashed commit that it builds from your pull request, GitHub must know
 | 
			
		||||
your verifying key. Please set up [signature verification][signing].
 | 
			
		||||
 | 
			
		||||
[rippled]: https://github.com/XRPLF/rippled
 | 
			
		||||
[signing]:
 | 
			
		||||
    https://docs.github.com/en/authentication/managing-commit-signature-verification/about-commit-signature-verification
 | 
			
		||||
In general, external contributions should be developed in your personal
 | 
			
		||||
[fork][forking]. Contributions from developers with write permissions
 | 
			
		||||
should be done in [the main repository][rippled] in a branch with
 | 
			
		||||
a permitted prefix. Permitted prefixes are:
 | 
			
		||||
* XLS-[a-zA-Z0-9]+/.+
 | 
			
		||||
  * e.g. XLS-0033d/mpt-clarify-STEitherAmount
 | 
			
		||||
* [GitHub username]/.+
 | 
			
		||||
  * e.g. JoelKatz/fix-rpc-webhook-queue
 | 
			
		||||
* [Organization name]/.+
 | 
			
		||||
  * e.g. ripple/antithesis
 | 
			
		||||
 | 
			
		||||
Regardless of where the branch is created, please open a *draft* pull
 | 
			
		||||
request as soon as possible after pushing the branch to Github, to
 | 
			
		||||
increase visibility, and ease feedback during the development process.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## Major contributions
 | 
			
		||||
@@ -49,6 +57,7 @@ author delegates that responsibility to others.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## Before making a pull request
 | 
			
		||||
(Or marking a draft pull request as ready.)
 | 
			
		||||
 | 
			
		||||
Changes that alter transaction processing must be guarded by an
 | 
			
		||||
[Amendment](https://xrpl.org/amendments.html).
 | 
			
		||||
@@ -57,43 +66,141 @@ Amendment.
 | 
			
		||||
 | 
			
		||||
Ensure that your code compiles according to the build instructions in
 | 
			
		||||
[`BUILD.md`](./BUILD.md).
 | 
			
		||||
If you create new source files, they must go under `src/ripple`.
 | 
			
		||||
You will need to add them to one of the
 | 
			
		||||
[source lists](./Builds/CMake/RippledCore.cmake) in CMake.
 | 
			
		||||
 | 
			
		||||
Please write tests for your code.
 | 
			
		||||
If you create new test source files, they must go under `src/test`.
 | 
			
		||||
You will need to add them to one of the
 | 
			
		||||
[source lists](./Builds/CMake/RippledCore.cmake) in CMake.
 | 
			
		||||
If your test can be run offline, in under 60 seconds, then it can be an
 | 
			
		||||
automatic test run by `rippled --unittest`.
 | 
			
		||||
Otherwise, it must be a manual test.
 | 
			
		||||
 | 
			
		||||
If you create new source files, they must be organized as follows:
 | 
			
		||||
* If the files are in any of the `libxrpl` modules, the headers (`.h`) must go
 | 
			
		||||
  under `include/xrpl`, and source (`.cpp`) files must go under
 | 
			
		||||
  `src/libxrpl`.
 | 
			
		||||
* All other non-test files must go under `src/xrpld`.
 | 
			
		||||
* All test source files must go under `src/test`.
 | 
			
		||||
 | 
			
		||||
The source must be formatted according to the style guide below.
 | 
			
		||||
 | 
			
		||||
Header includes must be [levelized](./Builds/levelization).
 | 
			
		||||
 | 
			
		||||
Changes should be usually squashed down into a single commit.
 | 
			
		||||
Some larger or more complicated change sets make more sense,
 | 
			
		||||
and are easier to review if organized into multiple logical commits.
 | 
			
		||||
Either way, all commits should fit the following criteria:
 | 
			
		||||
* Changes should be presented in a single commit or a logical
 | 
			
		||||
  sequence of commits.
 | 
			
		||||
  Specifically, chronological commits that simply
 | 
			
		||||
  reflect the history of how the author implemented
 | 
			
		||||
  the change, "warts and all", are not useful to
 | 
			
		||||
  reviewers.
 | 
			
		||||
* Every commit should have a [good message](#good-commit-messages).
 | 
			
		||||
  to explain a specific aspects of the change.
 | 
			
		||||
* Every commit should be signed.
 | 
			
		||||
* Every commit should be well-formed (builds successfully,
 | 
			
		||||
  unit tests passing), as this helps to resolve merge
 | 
			
		||||
  conflicts, and makes it easier to use `git bisect`
 | 
			
		||||
  to find bugs.
 | 
			
		||||
 | 
			
		||||
### Good commit messages
 | 
			
		||||
 | 
			
		||||
Refer to
 | 
			
		||||
["How to Write a Git Commit Message"](https://cbea.ms/git-commit/)
 | 
			
		||||
for general rules on writing a good commit message.
 | 
			
		||||
 | 
			
		||||
tl;dr
 | 
			
		||||
> 1. Separate subject from body with a blank line.
 | 
			
		||||
> 2. Limit the subject line to 50 characters.
 | 
			
		||||
>    * [...]shoot for 50 characters, but consider 72 the hard limit.
 | 
			
		||||
> 3. Capitalize the subject line.
 | 
			
		||||
> 4. Do not end the subject line with a period.
 | 
			
		||||
> 5. Use the imperative mood in the subject line.
 | 
			
		||||
>    * A properly formed Git commit subject line should always be able
 | 
			
		||||
>      to complete the following sentence: "If applied, this commit will
 | 
			
		||||
>      _your subject line here_".
 | 
			
		||||
> 6. Wrap the body at 72 characters.
 | 
			
		||||
> 7. Use the body to explain what and why vs. how.
 | 
			
		||||
 | 
			
		||||
In addition to those guidelines, please add one of the following
 | 
			
		||||
prefixes to the subject line if appropriate.
 | 
			
		||||
* `fix:` - The primary purpose is to fix an existing bug.
 | 
			
		||||
* `perf:` - The primary purpose is performance improvements.
 | 
			
		||||
* `refactor:` - The changes refactor code without affecting
 | 
			
		||||
  functionality.
 | 
			
		||||
* `test:` - The changes _only_ affect unit tests.
 | 
			
		||||
* `docs:` - The changes _only_ affect documentation. This can
 | 
			
		||||
  include code comments in addition to `.md` files like this one.
 | 
			
		||||
* `build:` - The changes _only_ affect the build process,
 | 
			
		||||
  including CMake and/or Conan settings.
 | 
			
		||||
* `chore:` - Other tasks that don't affect the binary, but don't fit
 | 
			
		||||
  any of the other cases. e.g. formatting, git settings, updating
 | 
			
		||||
  Github Actions jobs.
 | 
			
		||||
 | 
			
		||||
Whenever possible, when updating commits after the PR is open, please
 | 
			
		||||
add the PR number to the end of the subject line. e.g. `test: Add
 | 
			
		||||
unit tests for Feature X (#1234)`.
 | 
			
		||||
 | 
			
		||||
## Pull requests
 | 
			
		||||
 | 
			
		||||
In general, pull requests use `develop` as the base branch.
 | 
			
		||||
The exceptions are
 | 
			
		||||
* Fixes and improvements to a release candidate use `release` as the
 | 
			
		||||
  base.
 | 
			
		||||
* Hotfixes use `master` as the base.
 | 
			
		||||
 | 
			
		||||
(Hotfixes are an exception.)
 | 
			
		||||
If your changes are not quite ready, but you want to make it easily available
 | 
			
		||||
for preliminary examination or review, you can create a "Draft" pull request.
 | 
			
		||||
While a pull request is marked as a "Draft", you can rebase or reorganize the
 | 
			
		||||
commits in the pull request as desired.
 | 
			
		||||
 | 
			
		||||
Changes to pull requests must be added as new commits.
 | 
			
		||||
Once code reviewers have started looking at your code, please avoid
 | 
			
		||||
force-pushing a branch in a pull request.
 | 
			
		||||
Github pull requests are created as "Ready" by default, or you can mark
 | 
			
		||||
a "Draft" pull request as "Ready".
 | 
			
		||||
Once a pull request is marked as "Ready",
 | 
			
		||||
any changes must be added as new commits. Do not
 | 
			
		||||
force-push to a branch in a pull request under review.
 | 
			
		||||
(This includes rebasing your branch onto the updated base branch.
 | 
			
		||||
Use a merge operation, instead or hit the "Update branch" button
 | 
			
		||||
at the bottom of the Github PR page.)
 | 
			
		||||
This preserves the ability for reviewers to filter changes since their last
 | 
			
		||||
review.
 | 
			
		||||
 | 
			
		||||
A pull request must obtain **approvals from at least two reviewers** before it
 | 
			
		||||
can be considered for merge by a Maintainer.
 | 
			
		||||
A pull request must obtain **approvals from at least two reviewers**
 | 
			
		||||
before it can be considered for merge by a Maintainer.
 | 
			
		||||
Maintainers retain discretion to require more approvals if they feel the
 | 
			
		||||
credibility of the existing approvals is insufficient.
 | 
			
		||||
 | 
			
		||||
Pull requests must be merged by [squash-and-merge][2]
 | 
			
		||||
Pull requests must be merged by [squash-and-merge][squash]
 | 
			
		||||
to preserve a linear history for the `develop` branch.
 | 
			
		||||
 | 
			
		||||
### "Ready to merge"
 | 
			
		||||
 | 
			
		||||
A pull request should only have the "Ready to merge" label added when it
 | 
			
		||||
meets a few criteria:
 | 
			
		||||
 | 
			
		||||
1. It must have two approving reviews [as described
 | 
			
		||||
   above](#pull-requests). (Exception: PRs that are deemed "trivial"
 | 
			
		||||
   only need one approval.)
 | 
			
		||||
2. All CI checks must be complete and passed. (One-off failures may
 | 
			
		||||
   be acceptable if they are related to a known issue.)
 | 
			
		||||
3. The PR must have a [good commit message](#good-commit-messages).
 | 
			
		||||
   * If the PR started with a good commit message, and it doesn't
 | 
			
		||||
     need to be updated, the author can indicate that in a comment.
 | 
			
		||||
   * Any contributor, preferably the author, can leave a comment
 | 
			
		||||
     suggesting a commit message.
 | 
			
		||||
   * If the author squashes and rebases the code in preparation for
 | 
			
		||||
     merge, they should also ensure the commit message(s) are updated
 | 
			
		||||
     as well.
 | 
			
		||||
4. The PR branch must be up to date with the base branch (usually
 | 
			
		||||
   `develop`). This is usually accomplished by merging the base branch
 | 
			
		||||
   into the feature branch, but if the other criteria are met, the
 | 
			
		||||
   changes can be squashed and rebased on top of the base branch.
 | 
			
		||||
5. Finally, and most importantly, the author of the PR must
 | 
			
		||||
   positively indicate that the PR is ready to merge. That can be
 | 
			
		||||
   accomplished by adding the "Ready to merge" label if their role
 | 
			
		||||
   allows, or by leaving a comment to the effect that the PR is ready to
 | 
			
		||||
   merge.
 | 
			
		||||
 | 
			
		||||
Once the "Ready to merge" label is added, a maintainer may merge the PR
 | 
			
		||||
at any time, so don't use it lightly.
 | 
			
		||||
 | 
			
		||||
# Style guide
 | 
			
		||||
 | 
			
		||||
@@ -104,7 +211,7 @@ coherent rather than a set of _thou shalt not_ commandments.
 | 
			
		||||
 | 
			
		||||
## Formatting
 | 
			
		||||
 | 
			
		||||
All code must conform to `clang-format` version 10,
 | 
			
		||||
All code must conform to `clang-format` version 18,
 | 
			
		||||
according to the settings in [`.clang-format`](./.clang-format),
 | 
			
		||||
unless the result would be unreasonably difficult to read or maintain.
 | 
			
		||||
To demarcate lines that should be left as-is, surround them with comments like
 | 
			
		||||
@@ -119,12 +226,84 @@ this:
 | 
			
		||||
You can format individual files in place by running `clang-format -i <file>...`
 | 
			
		||||
from any directory within this project.
 | 
			
		||||
 | 
			
		||||
There is a Continuous Integration job that runs clang-format on pull requests. If the code doesn't comply, a patch file that corrects auto-fixable formatting issues is generated.
 | 
			
		||||
 | 
			
		||||
To download the patch file:
 | 
			
		||||
 | 
			
		||||
1. Next to `clang-format / check (pull_request) Failing after #s` -> click **Details** to open the details page.
 | 
			
		||||
2. Left menu -> click **Summary**
 | 
			
		||||
3. Scroll down to near the bottom-right under `Artifacts` -> click **clang-format.patch**
 | 
			
		||||
4. Download the zip file and extract it to your local git repository. Run `git apply [patch-file-name]`.
 | 
			
		||||
5. Commit and push.
 | 
			
		||||
 | 
			
		||||
You can install a pre-commit hook to automatically run `clang-format` before every commit:
 | 
			
		||||
```
 | 
			
		||||
pip3 install pre-commit
 | 
			
		||||
pre-commit install
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Contracts and instrumentation
 | 
			
		||||
 | 
			
		||||
We are using [Antithesis](https://antithesis.com/) for continuous fuzzing,
 | 
			
		||||
and keep a copy of [Antithesis C++ SDK](https://github.com/antithesishq/antithesis-sdk-cpp/)
 | 
			
		||||
in `external/antithesis-sdk`. One of the aims of fuzzing is to identify bugs
 | 
			
		||||
by finding external conditions which cause contracts violations inside `rippled`.
 | 
			
		||||
The contracts are expressed as `XRPL_ASSERT` or `UNREACHABLE` (defined in
 | 
			
		||||
`include/xrpl/beast/utility/instrumentation.h`), which are effectively (outside
 | 
			
		||||
of Antithesis) wrappers for `assert(...)` with added name. The purpose of name
 | 
			
		||||
is to provide contracts with stable identity which does not rely on line numbers.
 | 
			
		||||
 | 
			
		||||
When `rippled` is built with the Antithesis instrumentation enabled
 | 
			
		||||
(using `voidstar` CMake option) and ran on the Antithesis platform, the
 | 
			
		||||
contracts become
 | 
			
		||||
[test properties](https://antithesis.com/docs/using_antithesis/properties.html);
 | 
			
		||||
otherwise they are just like a regular `assert`.
 | 
			
		||||
To learn more about Antithesis, see
 | 
			
		||||
[How Antithesis Works](https://antithesis.com/docs/introduction/how_antithesis_works.html)
 | 
			
		||||
and [C++ SDK](https://antithesis.com/docs/using_antithesis/sdk/cpp/overview.html#)
 | 
			
		||||
 | 
			
		||||
We continue to use the old style `assert` or `assert(false)` in certain
 | 
			
		||||
locations, where the reporting of contract violations on the Antithesis
 | 
			
		||||
platform is either not possible or not useful.
 | 
			
		||||
 | 
			
		||||
For this reason:
 | 
			
		||||
* The locations where `assert` or `assert(false)` contracts should continue to be used:
 | 
			
		||||
  * `constexpr` functions
 | 
			
		||||
  * unit tests i.e. files under `src/test`
 | 
			
		||||
  * unit tests-related modules (files under `beast/test` and `beast/unit_test`)
 | 
			
		||||
* Outside of the listed locations, do not use `assert`; use `XRPL_ASSERT` instead,
 | 
			
		||||
  giving it unique name, with the short description of the contract.
 | 
			
		||||
* Outside of the listed locations, do not use `assert(false)`; use
 | 
			
		||||
  `UNREACHABLE` instead, giving it unique name, with the description of the
 | 
			
		||||
  condition being violated
 | 
			
		||||
* The contract name should start with a full name (including scope) of the
 | 
			
		||||
  function, optionally a named lambda, followed by a colon ` : ` and a brief
 | 
			
		||||
  (typically at most five words) description. `UNREACHABLE` contracts
 | 
			
		||||
  can use slightly longer descriptions. If there are multiple overloads of the
 | 
			
		||||
  function, use common sense to balance both brevity and unambiguity of the
 | 
			
		||||
  function name. NOTE: the purpose of name is to provide stable means of
 | 
			
		||||
  unique identification of every contract; for this reason try to avoid elements
 | 
			
		||||
  which can change in some obvious refactors or when reinforcing the condition.
 | 
			
		||||
* Contract description typically (except for `UNREACHABLE`) should describe the
 | 
			
		||||
  _expected_ condition, as in "I assert that _expected_ is true".
 | 
			
		||||
* Contract description for `UNREACHABLE` should describe the _unexpected_
 | 
			
		||||
  situation which caused the line to have been reached.
 | 
			
		||||
* Example good name for an
 | 
			
		||||
  `UNREACHABLE` macro `"Json::operator==(Value, Value) : invalid type"`; example
 | 
			
		||||
  good name for an `XRPL_ASSERT` macro `"Json::Value::asCString : valid type"`.
 | 
			
		||||
* Example **bad** name
 | 
			
		||||
  `"RFC1751::insert(char* s, int x, int start, int length) : length is greater than or equal zero"`
 | 
			
		||||
  (missing namespace, unnecessary full function signature, description too verbose).
 | 
			
		||||
  Good name: `"ripple::RFC1751::insert : minimum length"`.
 | 
			
		||||
* In **few** well-justified cases a non-standard name can be used, in which case a
 | 
			
		||||
  comment should be placed to explain the rationale (example in `contract.cpp`)
 | 
			
		||||
* Do **not** rename a contract without a good reason (e.g. the name no longer
 | 
			
		||||
  reflects the location or the condition being checked)
 | 
			
		||||
* Do not use `std::unreachable`
 | 
			
		||||
* Do not put contracts where they can be violated by an external condition
 | 
			
		||||
  (e.g. timing, data payload before mandatory validation etc.) as this creates
 | 
			
		||||
  bogus bug reports (and causes crashes of Debug builds)
 | 
			
		||||
 | 
			
		||||
## Unit Tests
 | 
			
		||||
To execute all unit tests:
 | 
			
		||||
 | 
			
		||||
@@ -197,17 +376,646 @@ existing maintainer without a vote.
 | 
			
		||||
 | 
			
		||||
## Current Maintainers
 | 
			
		||||
 | 
			
		||||
Maintainers are users with maintain or admin access to the repo.
 | 
			
		||||
 | 
			
		||||
* [bthomee](https://github.com/bthomee) (Ripple)
 | 
			
		||||
* [intelliot](https://github.com/intelliot) (Ripple)
 | 
			
		||||
* [JoelKatz](https://github.com/JoelKatz) (Ripple)
 | 
			
		||||
* [manojsdoshi](https://github.com/manojsdoshi) (Ripple)
 | 
			
		||||
* [n3tc4t](https://github.com/n3tc4t) (XRPL Labs)
 | 
			
		||||
* [Nik Bougalis](https://github.com/nbougalis)
 | 
			
		||||
* [nixer89](https://github.com/nixer89) (XRP Ledger Foundation)
 | 
			
		||||
* [RichardAH](https://github.com/RichardAH) (XRPL Labs + XRP Ledger Foundation)
 | 
			
		||||
* [seelabs](https://github.com/seelabs) (Ripple)
 | 
			
		||||
* [RichardAH](https://github.com/RichardAH) (XRP Ledger Foundation)
 | 
			
		||||
* [Silkjaer](https://github.com/Silkjaer) (XRP Ledger Foundation)
 | 
			
		||||
* [WietseWind](https://github.com/WietseWind) (XRPL Labs + XRP Ledger Foundation)
 | 
			
		||||
* [ximinez](https://github.com/ximinez) (Ripple)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## Current Code Reviewers
 | 
			
		||||
 | 
			
		||||
Code Reviewers are developers who have the ability to review, approve, and
 | 
			
		||||
in some cases merge source code changes.
 | 
			
		||||
 | 
			
		||||
* [HowardHinnant](https://github.com/HowardHinnant) (Ripple)
 | 
			
		||||
* [scottschurr](https://github.com/scottschurr) (Ripple)
 | 
			
		||||
* [seelabs](https://github.com/seelabs) (Ripple)
 | 
			
		||||
* [Ed Hennis](https://github.com/ximinez) (Ripple)
 | 
			
		||||
* [mvadari](https://github.com/mvadari) (Ripple)
 | 
			
		||||
* [thejohnfreeman](https://github.com/thejohnfreeman) (Ripple)
 | 
			
		||||
* [Bronek](https://github.com/Bronek) (Ripple)
 | 
			
		||||
* [manojsdoshi](https://github.com/manojsdoshi) (Ripple)
 | 
			
		||||
* [godexsoft](https://github.com/godexsoft) (Ripple)
 | 
			
		||||
* [mDuo13](https://github.com/mDuo13) (Ripple)
 | 
			
		||||
* [ckniffen](https://github.com/ckniffen) (Ripple)
 | 
			
		||||
* [arihantkothari](https://github.com/arihantkothari) (Ripple)
 | 
			
		||||
* [pwang200](https://github.com/pwang200) (Ripple)
 | 
			
		||||
* [sophiax851](https://github.com/sophiax851) (Ripple)
 | 
			
		||||
* [shawnxie999](https://github.com/shawnxie999) (Ripple)
 | 
			
		||||
* [gregtatcam](https://github.com/gregtatcam) (Ripple)
 | 
			
		||||
* [mtrippled](https://github.com/mtrippled) (Ripple)
 | 
			
		||||
* [ckeshava](https://github.com/ckeshava) (Ripple)
 | 
			
		||||
* [nbougalis](https://github.com/nbougalis) None
 | 
			
		||||
* [RichardAH](https://github.com/RichardAH) (XRPL Labs + XRP Ledger Foundation)
 | 
			
		||||
* [dangell7](https://github.com/dangell7) (XRPL Labs)
 | 
			
		||||
 | 
			
		||||
Developers not on this list are able and encouraged to submit feedback
 | 
			
		||||
on pending code changes (open pull requests).
 | 
			
		||||
 | 
			
		||||
## Instructions for maintainers
 | 
			
		||||
 | 
			
		||||
These instructions assume you have your git upstream remotes configured
 | 
			
		||||
to avoid accidental pushes to the main repo, and a remote group
 | 
			
		||||
specifying both of them. e.g.
 | 
			
		||||
```
 | 
			
		||||
$ git remote -v | grep upstream
 | 
			
		||||
upstream        https://github.com/XRPLF/rippled.git (fetch)
 | 
			
		||||
upstream        https://github.com/XRPLF/rippled.git (push)
 | 
			
		||||
upstream-push   git@github.com:XRPLF/rippled.git (fetch)
 | 
			
		||||
upstream-push   git@github.com:XRPLF/rippled.git (push)
 | 
			
		||||
 | 
			
		||||
$ git config remotes.upstreams
 | 
			
		||||
upstream upstream-push
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
You can use the [setup-upstreams] script to set this up.
 | 
			
		||||
 | 
			
		||||
It also assumes you have a default gpg signing key set up in git. e.g.
 | 
			
		||||
```
 | 
			
		||||
$ git config user.signingkey
 | 
			
		||||
968479A1AFF927E37D1A566BB5690EEEBB952194
 | 
			
		||||
# (This is github's key. Use your own.)
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### When and how to merge pull requests
 | 
			
		||||
 | 
			
		||||
The maintainer should double-check that the PR has met all the
 | 
			
		||||
necessary criteria, and can request additional information from the
 | 
			
		||||
owner, or additional reviews, and can always feel free to remove the
 | 
			
		||||
"Ready to merge" label if appropriate. The maintainer has final say on
 | 
			
		||||
whether a PR gets merged, and are encouraged to communicate and issues
 | 
			
		||||
or concerns to other maintainers.
 | 
			
		||||
 | 
			
		||||
#### Most pull requests: "Squash and merge"
 | 
			
		||||
 | 
			
		||||
Most pull requests don't need special handling, and can simply be
 | 
			
		||||
merged using the "Squash and merge" button on the Github UI. Update
 | 
			
		||||
the suggested commit message, or modify it as needed.
 | 
			
		||||
 | 
			
		||||
#### Slightly more complicated pull requests
 | 
			
		||||
 | 
			
		||||
Some pull requests need to be pushed to `develop` as more than one
 | 
			
		||||
commit. A PR author may *request* to merge as separate commits. They
 | 
			
		||||
must *justify* why separate commits are needed, and *specify* how they
 | 
			
		||||
would like the commits to be merged. If you disagree with the author,
 | 
			
		||||
discuss it with them directly.
 | 
			
		||||
 | 
			
		||||
If the process is reasonable, follow it. The simplest option is to do a
 | 
			
		||||
fast forward only merge (`--ff-only`) on the command line and push to
 | 
			
		||||
`develop`.
 | 
			
		||||
 | 
			
		||||
Some examples of when separate commits are worthwhile are:
 | 
			
		||||
1. PRs where source files are reorganized in multiple steps.
 | 
			
		||||
2. PRs where the commits are mostly independent and *could* be separate
 | 
			
		||||
   PRs, but are pulled together into one PR under a commit theme or
 | 
			
		||||
   issue.
 | 
			
		||||
3. PRs that are complicated enough that `git bisect` would not be much
 | 
			
		||||
   help if it determined this PR introduced a problem.
 | 
			
		||||
 | 
			
		||||
Either way, check that:
 | 
			
		||||
* The commits are based on the current tip of `develop`.
 | 
			
		||||
* The commits are clean: No merge commits (except when reverse
 | 
			
		||||
  merging), no "[FOLD]" or "fixup!" messages.
 | 
			
		||||
* All commits are signed. If the commits are not signed by the author, use
 | 
			
		||||
  `git commit --amend -S` to sign them yourself.
 | 
			
		||||
* At least one (but preferably all) of the commits has the PR number
 | 
			
		||||
  in the commit message.
 | 
			
		||||
 | 
			
		||||
The "Create a merge commit" and "Rebase and merge" options should be
 | 
			
		||||
disabled in the Github UI, but if you ever find them available **Do not
 | 
			
		||||
use them!**
 | 
			
		||||
 | 
			
		||||
### Releases
 | 
			
		||||
 | 
			
		||||
All releases, including release candidates and betas, are handled
 | 
			
		||||
differently from typical PRs. Most importantly, never use
 | 
			
		||||
the Github UI to merge a release.
 | 
			
		||||
 | 
			
		||||
Rippled uses a linear workflow model that can be summarized as:
 | 
			
		||||
 | 
			
		||||
1. In between releases, developers work against the `develop` branch.
 | 
			
		||||
2. Periodically, a maintainer will build and tag a beta version from
 | 
			
		||||
   `develop`, which is pushed to `release`.
 | 
			
		||||
   * Betas are usually released every two to three weeks, though that
 | 
			
		||||
     schedule can vary depending on progress, availability, and other
 | 
			
		||||
     factors.
 | 
			
		||||
3. When the changes in `develop` are considered stable and mature enough
 | 
			
		||||
   to be ready to release, a release candidate (RC) is built and tagged
 | 
			
		||||
   from `develop`, and merged to `release`.
 | 
			
		||||
   * Further development for that release (primarily fixes) then
 | 
			
		||||
     continues against `release`, while other development continues on
 | 
			
		||||
     `develop`. Effectively, `release` is forked from `develop`. Changes
 | 
			
		||||
     to `release` must be reverse merged to `develop`.
 | 
			
		||||
4. When the candidate has passed testing and is ready for release, the
 | 
			
		||||
   final release is merged to `master`.
 | 
			
		||||
5. If any issues are found post-release, a hotfix / point release may be
 | 
			
		||||
   created, which is merged to `master`, and then reverse merged to
 | 
			
		||||
   `develop`.
 | 
			
		||||
 | 
			
		||||
#### Betas, and the first release candidate
 | 
			
		||||
 | 
			
		||||
##### Preparing the `develop` branch
 | 
			
		||||
 | 
			
		||||
1. Optimally, the `develop` branch will be ready to go, with all
 | 
			
		||||
   relevant PRs already merged.
 | 
			
		||||
2. If there are any PRs pending, merge them **BEFORE** preparing the beta.
 | 
			
		||||
   1. If only one or two PRs need to be merged, merge those PRs [as
 | 
			
		||||
      normal](#when-and-how-to-merge-pull-requests), updating the second
 | 
			
		||||
      one, and waiting for CI to finish in between.
 | 
			
		||||
   2. If there are several pending PRs, do not use the Github UI,
 | 
			
		||||
      because the delays waiting for CI in between each merge will be
 | 
			
		||||
      unnecessarily onerous. (Incidentally, this process can also be
 | 
			
		||||
      used to merge if the Github UI has issues.) Merge each PR branch
 | 
			
		||||
      directly to a `release-next` on your local machine and create a single
 | 
			
		||||
      PR, then push your branch to `develop`.
 | 
			
		||||
      1. Squash the changes from each PR, one commit each (unless more
 | 
			
		||||
         are needed), being sure to sign each commit and update the
 | 
			
		||||
         commit message to include the PR number. You may be able to use
 | 
			
		||||
         a fast-forward merge for the first PR.
 | 
			
		||||
      2. Push your branch.
 | 
			
		||||
      3. Continue to [Making the release](#making-the-release) to update
 | 
			
		||||
         the version number, etc.
 | 
			
		||||
 | 
			
		||||
      The workflow may look something like:
 | 
			
		||||
```
 | 
			
		||||
git fetch --multiple upstreams user1 user2 user3 [...]
 | 
			
		||||
git checkout -B release-next --no-track upstream/develop
 | 
			
		||||
 | 
			
		||||
# Only do an ff-only merge if prbranch1 is either already
 | 
			
		||||
# squashed, or needs to be merged with separate commits,
 | 
			
		||||
# and has no merge commits.
 | 
			
		||||
# Use -S on the ff-only merge if prbranch1 isn't signed.
 | 
			
		||||
git merge [-S] --ff-only user1/prbranch1
 | 
			
		||||
 | 
			
		||||
git merge --squash user2/prbranch2
 | 
			
		||||
git commit -S # Use the commit message provided on the PR
 | 
			
		||||
 | 
			
		||||
git merge --squash user3/prbranch3
 | 
			
		||||
git commit -S # Use the commit message provided on the PR
 | 
			
		||||
 | 
			
		||||
[...]
 | 
			
		||||
 | 
			
		||||
# Make sure the commits look right
 | 
			
		||||
git log --show-signature "upstream/develop..HEAD"
 | 
			
		||||
 | 
			
		||||
git push --set-upstream origin
 | 
			
		||||
 | 
			
		||||
# Continue to "Making the release" to update the version number, so
 | 
			
		||||
# everything can be done in one PR.
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
You can also use the [squash-branches] script.
 | 
			
		||||
 | 
			
		||||
You may also need to manually close the open PRs after the changes are
 | 
			
		||||
merged to `develop`. Be sure to include the commit ID.
 | 
			
		||||
 | 
			
		||||
##### Making the release
 | 
			
		||||
 | 
			
		||||
This includes, betas, and the first release candidate (RC).
 | 
			
		||||
 | 
			
		||||
1. If you didn't create one [preparing the `develop`
 | 
			
		||||
   branch](#preparing-the-develop-branch), Ensure there is no old
 | 
			
		||||
   `release-next` branch hanging around.  Then make a `release-next`
 | 
			
		||||
   branch that only changes the version number. e.g.
 | 
			
		||||
```
 | 
			
		||||
git fetch upstreams
 | 
			
		||||
 | 
			
		||||
git checkout --no-track -B release-next upstream/develop
 | 
			
		||||
 | 
			
		||||
v="A.B.C-bD"
 | 
			
		||||
build=$( find -name BuildInfo.cpp )
 | 
			
		||||
sed 's/\(^.*versionString =\).*$/\1 "'${v}'"/' ${build} > version.cpp && mv -vi version.cpp ${build}
 | 
			
		||||
 | 
			
		||||
git diff
 | 
			
		||||
 | 
			
		||||
git add ${build}
 | 
			
		||||
 | 
			
		||||
git commit -S -m "Set version to ${v}"
 | 
			
		||||
 | 
			
		||||
# You could use your "origin" repo, but some CI tests work better on upstream.
 | 
			
		||||
git push upstream-push
 | 
			
		||||
git fetch upstreams
 | 
			
		||||
git branch --set-upstream-to=upstream/release-next
 | 
			
		||||
```
 | 
			
		||||
   You can also use the [update-version] script.
 | 
			
		||||
2. Create a Pull Request for `release-next` with **`develop`** as
 | 
			
		||||
   the base branch.
 | 
			
		||||
   1. Use the title "[TRIVIAL] Set version to X.X.X-bX".
 | 
			
		||||
   2. Instead of the default description template, use the following:
 | 
			
		||||
```
 | 
			
		||||
## High Level Overview of Change
 | 
			
		||||
 | 
			
		||||
This PR only changes the version number. It will be merged as
 | 
			
		||||
soon as Github CI actions successfully complete.
 | 
			
		||||
```
 | 
			
		||||
3. Wait for CI to successfully complete, and get someone to approve
 | 
			
		||||
   the PR. (It is safe to ignore known CI issues.)
 | 
			
		||||
4. Push the updated `develop` branch using your `release-next`
 | 
			
		||||
   branch. **Do not use the Github UI. It's important to preserve
 | 
			
		||||
   commit IDs.**
 | 
			
		||||
```
 | 
			
		||||
git push upstream-push release-next:develop
 | 
			
		||||
```
 | 
			
		||||
5. In the unlikely event that the push fails because someone has merged
 | 
			
		||||
   something else in the meantime, rebase your branch onto the updated
 | 
			
		||||
   `develop` branch, push again, and go back to step 3.
 | 
			
		||||
6. Ensure that your PR against `develop` is closed. Github should do it
 | 
			
		||||
   automatically.
 | 
			
		||||
7. Once this is done, forward progress on `develop` can continue
 | 
			
		||||
   (other PRs may be merged).
 | 
			
		||||
8. Now create a Pull Request for `release-next` with **`release`** as
 | 
			
		||||
   the base branch.  Instead of the default template, reuse and update
 | 
			
		||||
   the message from the previous release. Include the following verbiage
 | 
			
		||||
   somewhere in the description:
 | 
			
		||||
```
 | 
			
		||||
The base branch is `release`. [All releases (including
 | 
			
		||||
betas)](https://github.com/XRPLF/rippled/blob/develop/CONTRIBUTING.md#before-you-start)
 | 
			
		||||
go in `release`. This PR branch will be pushed directly to `release` (not
 | 
			
		||||
squashed or rebased, and not using the GitHub UI).
 | 
			
		||||
```
 | 
			
		||||
7. Sign-offs for the three platforms (Linux, Mac, Windows) usually occur
 | 
			
		||||
   offline, but at least one approval will be needed on the PR.
 | 
			
		||||
   * If issues are discovered during testing, simply abandon the
 | 
			
		||||
     release.  It's easy to start a new release, it should be easy to
 | 
			
		||||
     abandon one. **DO NOT REUSE THE VERSION NUMBER.** e.g. If you
 | 
			
		||||
     abandon 2.4.0-b1, the next attempt will be 2.4.0-b2.
 | 
			
		||||
8. Once everything is ready to go, push to `release`.
 | 
			
		||||
```
 | 
			
		||||
git fetch upstreams
 | 
			
		||||
 | 
			
		||||
# Just to be safe, do a dry run first:
 | 
			
		||||
git push --dry-run upstream-push release-next:release
 | 
			
		||||
 | 
			
		||||
# If everything looks right, push the branch
 | 
			
		||||
git push upstream-push release-next:release
 | 
			
		||||
 | 
			
		||||
# Check that all of the branches are updated
 | 
			
		||||
git fetch upstreams
 | 
			
		||||
git log -1 --oneline
 | 
			
		||||
# The output should look like:
 | 
			
		||||
# 0123456789 (HEAD -> upstream/release-next, upstream/release,
 | 
			
		||||
#            upstream/develop) Set version to 2.4.0-b1
 | 
			
		||||
# Note that upstream/develop may not be on this commit, but
 | 
			
		||||
# upstream/release must be.
 | 
			
		||||
# Other branches, including some from upstream-push, may also be
 | 
			
		||||
# present.
 | 
			
		||||
```
 | 
			
		||||
9. Tag the release, too.
 | 
			
		||||
```
 | 
			
		||||
git tag <version number>
 | 
			
		||||
git push upstream-push <version number>
 | 
			
		||||
```
 | 
			
		||||
10. Delete the `release-next` branch on the repo. Use the Github UI or:
 | 
			
		||||
```
 | 
			
		||||
git push --delete upstream-push release-next
 | 
			
		||||
```
 | 
			
		||||
11. Finally [create a new release on
 | 
			
		||||
    Github](https://github.com/XRPLF/rippled/releases).
 | 
			
		||||
 | 
			
		||||
#### Release candidates after the first
 | 
			
		||||
 | 
			
		||||
Once the first release candidate is [merged into
 | 
			
		||||
release](#making-the-release), then `release` and `develop` *are allowed
 | 
			
		||||
to diverge*.
 | 
			
		||||
 | 
			
		||||
If a bug or issue is discovered in a version that has a release
 | 
			
		||||
candidate being tested, any fix and new version will need to be applied
 | 
			
		||||
against `release`, then reverse-merged to `develop`. This helps keep git
 | 
			
		||||
history as linear as possible.
 | 
			
		||||
 | 
			
		||||
A `release-next` branch will be created from `release`, and any further
 | 
			
		||||
work for that release must be based on `release-next`.  Specifically,
 | 
			
		||||
PRs must use `release-next` as the base, and those PRs will be merged
 | 
			
		||||
directly to `release-next` when approved. Changes should be restricted
 | 
			
		||||
to bug fixes, but other changes may be necessary from time to time.
 | 
			
		||||
 | 
			
		||||
1. Open any PRs for the pending release using `release-next` as the base,
 | 
			
		||||
   so they can be merged directly in to it. Unlike `develop`, though,
 | 
			
		||||
   `release-next` can be thrown away and recreated if necessary.
 | 
			
		||||
2. Once a new release candidate is ready, create a version commit as in
 | 
			
		||||
   step 1 [above](#making-the-release) on `release-next`. You can use
 | 
			
		||||
   the [update-version] script for this, too.
 | 
			
		||||
3. Jump to step 8 ("Now create a Pull Request for `release-next` with
 | 
			
		||||
   **`release`** as the base") from the process
 | 
			
		||||
   [above](#making-the-release) to merge `release-next` into `release`.
 | 
			
		||||
 | 
			
		||||
##### Follow up: reverse merge
 | 
			
		||||
 | 
			
		||||
Once the RC is merged and tagged, it needs to be reverse merged into
 | 
			
		||||
`develop` as soon as possible.
 | 
			
		||||
 | 
			
		||||
1. Create a branch, based on `upstream/develop`.
 | 
			
		||||
   The branch name is not important, but could include "mergeNNNrcN".
 | 
			
		||||
   E.g. For release A.B.C-rcD, use `mergeABCrcD`.
 | 
			
		||||
```
 | 
			
		||||
git fetch upstreams
 | 
			
		||||
 | 
			
		||||
git checkout --no-track -b mergeABCrcD upstream/develop
 | 
			
		||||
```
 | 
			
		||||
2. Merge `release` into your branch.
 | 
			
		||||
```
 | 
			
		||||
# I like the "--edit --log --verbose" parameters, but they are
 | 
			
		||||
# not required.
 | 
			
		||||
git merge upstream/release
 | 
			
		||||
```
 | 
			
		||||
3. `BuildInfo.cpp` will have a conflict with the version number.
 | 
			
		||||
   Resolve it with the version from `develop` - the higher version.
 | 
			
		||||
4. Push your branch to your repo (or `upstream` if you have permission),
 | 
			
		||||
   and open a normal PR against `develop`. The "High level overview" can
 | 
			
		||||
   simply indicate that this is a merge of the RC. The "Context" should
 | 
			
		||||
   summarize the changes from the RC. Include the following text
 | 
			
		||||
   prominently:
 | 
			
		||||
```
 | 
			
		||||
This PR must be merged manually using a push. Do not use the Github UI.
 | 
			
		||||
```
 | 
			
		||||
5. Depending on the complexity of the changes, and/or merge conflicts,
 | 
			
		||||
   the PR may need a thorough review, or just a sign-off that the
 | 
			
		||||
   merge was done correctly.
 | 
			
		||||
6. If `develop` is updated before this PR is merged, do not merge
 | 
			
		||||
   `develop` back into your branch. Instead rebase preserving merges,
 | 
			
		||||
   or do the merge again. (See also the `rerere` git config setting.)
 | 
			
		||||
```
 | 
			
		||||
git rebase --rebase-merges upstream/develop
 | 
			
		||||
# OR
 | 
			
		||||
git reset --hard upstream/develop
 | 
			
		||||
git merge upstream/release
 | 
			
		||||
```
 | 
			
		||||
7. When the PR is ready, push it to `develop`.
 | 
			
		||||
```
 | 
			
		||||
git fetch upstreams
 | 
			
		||||
 | 
			
		||||
# Make sure the commits look right
 | 
			
		||||
git log --show-signature "upstream/develop^..HEAD"
 | 
			
		||||
 | 
			
		||||
git push upstream-push mergeABCrcD:develop
 | 
			
		||||
 | 
			
		||||
git fetch upstreams
 | 
			
		||||
```
 | 
			
		||||
Development on `develop` can proceed as normal.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
[1]: https://docs.github.com/en/get-started/quickstart/contributing-to-projects
 | 
			
		||||
[2]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/about-pull-request-merges#squash-and-merge-your-commits
 | 
			
		||||
#### Final releases
 | 
			
		||||
 | 
			
		||||
A final release is any release that is not a beta or RC, such as 2.2.0.
 | 
			
		||||
 | 
			
		||||
Only code that has already been tested and vetted across all three
 | 
			
		||||
platforms should be included in a final release. Most of the time, that
 | 
			
		||||
means that the commit immediately preceding the commit setting the
 | 
			
		||||
version number will be an RC. Occasionally, there may be last-minute bug
 | 
			
		||||
fixes included as well. If so, those bug fixes must have been tested
 | 
			
		||||
internally as if they were RCs (at minimum, ensuring unit tests pass,
 | 
			
		||||
and the app starts, syncs, and stops cleanly across all three
 | 
			
		||||
platforms.)
 | 
			
		||||
 | 
			
		||||
*If in doubt, make an RC first.*
 | 
			
		||||
 | 
			
		||||
The process for building a final release is very similar to [the process
 | 
			
		||||
for building a beta](#making-the-release), except the code will be
 | 
			
		||||
moving from `release` to `master` instead of from `develop` to
 | 
			
		||||
`release`, and both branches will be pushed at the same time.
 | 
			
		||||
 | 
			
		||||
1. Ensure there is no old `master-next` branch hanging around.
 | 
			
		||||
   Then make a `master-next` branch that only changes the version
 | 
			
		||||
   number. As above, or using the
 | 
			
		||||
   [update-version] script.
 | 
			
		||||
2. Create a Pull Request for `master-next` with **`master`** as
 | 
			
		||||
   the base branch.  Instead of the default template, reuse and update
 | 
			
		||||
   the message from the previous final release. Include the following verbiage
 | 
			
		||||
   somewhere in the description:
 | 
			
		||||
```
 | 
			
		||||
The base branch is `master`. This PR branch will be pushed directly to
 | 
			
		||||
`release` and `master` (not squashed or rebased, and not using the
 | 
			
		||||
GitHub UI).
 | 
			
		||||
```
 | 
			
		||||
7. Sign-offs for the three platforms (Linux, Mac, Windows) usually occur
 | 
			
		||||
   offline, but at least one approval will be needed on the PR.
 | 
			
		||||
   * If issues are discovered during testing, close the PR, delete
 | 
			
		||||
     `master-next`, and move development back to `release`, [issuing
 | 
			
		||||
     more RCs as necessary](#release-candidates-after-the-first)
 | 
			
		||||
8. Once everything is ready to go, push to `release` and `master`.
 | 
			
		||||
```
 | 
			
		||||
git fetch upstreams
 | 
			
		||||
 | 
			
		||||
# Just to be safe, do dry runs first:
 | 
			
		||||
git push --dry-run upstream-push master-next:release
 | 
			
		||||
git push --dry-run upstream-push master-next:master
 | 
			
		||||
 | 
			
		||||
# If everything looks right, push the branch
 | 
			
		||||
git push upstream-push master-next:release
 | 
			
		||||
git push upstream-push master-next:master
 | 
			
		||||
 | 
			
		||||
# Check that all of the branches are updated
 | 
			
		||||
git fetch upstreams
 | 
			
		||||
git log -1 --oneline
 | 
			
		||||
# The output should look like:
 | 
			
		||||
# 0123456789 (HEAD -> upstream/master-next, upstream/master,
 | 
			
		||||
#            upstream/release) Set version to A.B.0
 | 
			
		||||
# Note that both upstream/release and upstream/master must be on this
 | 
			
		||||
# commit.
 | 
			
		||||
# Other branches, including some from upstream-push, may also be
 | 
			
		||||
# present.
 | 
			
		||||
```
 | 
			
		||||
9. Tag the release, too.
 | 
			
		||||
```
 | 
			
		||||
git tag <version number>
 | 
			
		||||
git push upstream-push <version number>
 | 
			
		||||
```
 | 
			
		||||
10. Delete the `master-next` branch on the repo. Use the Github UI or:
 | 
			
		||||
```
 | 
			
		||||
git push --delete upstream-push master-next
 | 
			
		||||
```
 | 
			
		||||
11. [Create a new release on
 | 
			
		||||
    Github](https://github.com/XRPLF/rippled/releases). Be sure that
 | 
			
		||||
    "Set as the latest release" is checked.
 | 
			
		||||
12. Finally [reverse merge the release into `develop`](#follow-up-reverse-merge).
 | 
			
		||||
 | 
			
		||||
#### Special cases: point releases, hotfixes, etc.
 | 
			
		||||
 | 
			
		||||
On occassion, a bug or issue is discovered in a version that already
 | 
			
		||||
had a final release. Most of the time, development will have started
 | 
			
		||||
on the next version, and will usually have changes in `develop`
 | 
			
		||||
and often in `release`.
 | 
			
		||||
 | 
			
		||||
Because git history is kept as linear as possible, any fix and new
 | 
			
		||||
version will need to be applied against `master`.
 | 
			
		||||
 | 
			
		||||
The process for building a hotfix release is very similar to [the
 | 
			
		||||
process for building release candidates after the
 | 
			
		||||
first](#release-candidates-after-the-first) and [for building a final
 | 
			
		||||
release](#final-releases), except the changes will be done against
 | 
			
		||||
`master` instead of `release`.
 | 
			
		||||
 | 
			
		||||
If there is only a single issue for the hotfix, the work can be done in
 | 
			
		||||
any branch. When it's ready to merge, jump to step 3 using your branch
 | 
			
		||||
instead of `master-next`.
 | 
			
		||||
 | 
			
		||||
1. Create a `master-next` branch from `master`.
 | 
			
		||||
```
 | 
			
		||||
git checkout --no-track -b master-next upstream/master
 | 
			
		||||
git push upstream-push
 | 
			
		||||
git fetch upstreams
 | 
			
		||||
```
 | 
			
		||||
2. Open any PRs for the pending hotfix using `master-next` as the base,
 | 
			
		||||
   so they can be merged directly in to it. Unlike `develop`, though,
 | 
			
		||||
   `master-next` can be thrown away and recreated if necessary.
 | 
			
		||||
3. Once the hotfix is ready, create a version commit using the same
 | 
			
		||||
   steps as above, or use the
 | 
			
		||||
   [update-version] script.
 | 
			
		||||
4. Create a Pull Request for `master-next` with **`master`** as
 | 
			
		||||
   the base branch.  Instead of the default template, reuse and update
 | 
			
		||||
   the message from the previous final release. Include the following verbiage
 | 
			
		||||
   somewhere in the description:
 | 
			
		||||
```
 | 
			
		||||
The base branch is `master`. This PR branch will be pushed directly to
 | 
			
		||||
`master` (not squashed or rebased, and not using the GitHub UI).
 | 
			
		||||
```
 | 
			
		||||
7. Sign-offs for the three platforms (Linux, Mac, Windows) usually occur
 | 
			
		||||
   offline, but at least one approval will be needed on the PR.
 | 
			
		||||
   * If issues are discovered during testing, update `master-next` as
 | 
			
		||||
     needed, but ensure that the changes are properly squashed, and the
 | 
			
		||||
     version setting commit remains last
 | 
			
		||||
8. Once everything is ready to go, push to `master` **only**.
 | 
			
		||||
```
 | 
			
		||||
git fetch upstreams
 | 
			
		||||
 | 
			
		||||
# Just to be safe, do a dry run first:
 | 
			
		||||
git push --dry-run upstream-push master-next:master
 | 
			
		||||
 | 
			
		||||
# If everything looks right, push the branch
 | 
			
		||||
git push upstream-push master-next:master
 | 
			
		||||
 | 
			
		||||
# Check that all of the branches are updated
 | 
			
		||||
git fetch upstreams
 | 
			
		||||
git log -1 --oneline
 | 
			
		||||
# The output should look like:
 | 
			
		||||
# 0123456789 (HEAD -> upstream/master-next, upstream/master) Set version
 | 
			
		||||
#            to 2.4.1
 | 
			
		||||
# Note that upstream/master must be on this commit. upstream/release and
 | 
			
		||||
# upstream/develop should not.
 | 
			
		||||
# Other branches, including some from upstream-push, may also be
 | 
			
		||||
# present.
 | 
			
		||||
```
 | 
			
		||||
9. Tag the release, too.
 | 
			
		||||
```
 | 
			
		||||
git tag <version number>
 | 
			
		||||
git push upstream-push <version number>
 | 
			
		||||
```
 | 
			
		||||
9. Delete the `master-next` branch on the repo.
 | 
			
		||||
```
 | 
			
		||||
git push --delete upstream-push master-next
 | 
			
		||||
```
 | 
			
		||||
10. [Create a new release on
 | 
			
		||||
    Github](https://github.com/XRPLF/rippled/releases). Be sure that
 | 
			
		||||
    "Set as the latest release" is checked.
 | 
			
		||||
 | 
			
		||||
Once the hotfix is released, it needs to be reverse merged into
 | 
			
		||||
`develop` as soon as possible. It may also need to be merged into
 | 
			
		||||
`release` if a release candidate is under development.
 | 
			
		||||
 | 
			
		||||
1. Create a branch in your own repo, based on `upstream/develop`.
 | 
			
		||||
   The branch name is not important, but could include "mergeNNN".
 | 
			
		||||
   E.g. For release 2.2.3, use `merge223`.
 | 
			
		||||
```
 | 
			
		||||
git fetch upstreams
 | 
			
		||||
 | 
			
		||||
git checkout --no-track -b merge223 upstream/develop
 | 
			
		||||
```
 | 
			
		||||
2. Merge master into your branch.
 | 
			
		||||
```
 | 
			
		||||
# I like the "--edit --log --verbose" parameters, but they are
 | 
			
		||||
# not required.
 | 
			
		||||
git merge upstream/master
 | 
			
		||||
```
 | 
			
		||||
3. `BuildInfo.cpp` will have a conflict with the version number.
 | 
			
		||||
   Resolve it with the version from `develop` - the higher version.
 | 
			
		||||
4. Push your branch to your repo, and open a normal PR against
 | 
			
		||||
   `develop`. The "High level overview" can simply indicate that this
 | 
			
		||||
   is a merge of the hotfix version. The "Context" should summarize
 | 
			
		||||
   the changes from the hotfix. Include the following text
 | 
			
		||||
   prominently:
 | 
			
		||||
```
 | 
			
		||||
This PR must be merged manually using a --ff-only merge. Do not use the Github UI.
 | 
			
		||||
```
 | 
			
		||||
5. Depending on the complexity of the hotfix, and/or merge conflicts,
 | 
			
		||||
   the PR may need a thorough review, or just a sign-off that the
 | 
			
		||||
   merge was done correctly.
 | 
			
		||||
6. If `develop` is updated before this PR is merged, do not merge
 | 
			
		||||
   `develop` back into your branch. Instead rebase preserving merges,
 | 
			
		||||
   or do the merge again. (See also the `rerere` git config setting.)
 | 
			
		||||
```
 | 
			
		||||
git rebase --rebase-merges upstream/develop
 | 
			
		||||
# OR
 | 
			
		||||
git reset --hard upstream/develop
 | 
			
		||||
git merge upstream/master
 | 
			
		||||
```
 | 
			
		||||
7. When the PR is ready, push it to `develop`.
 | 
			
		||||
```
 | 
			
		||||
git fetch upstreams
 | 
			
		||||
 | 
			
		||||
# Make sure the commits look right
 | 
			
		||||
git log --show-signature "upstream/develop..HEAD"
 | 
			
		||||
 | 
			
		||||
git push upstream-push HEAD:develop
 | 
			
		||||
```
 | 
			
		||||
Development on `develop` can proceed as normal. It is recommended to
 | 
			
		||||
create a beta (or RC) immediately to ensure that everything worked as
 | 
			
		||||
expected.
 | 
			
		||||
 | 
			
		||||
##### An even rarer scenario: A hotfix on an old release
 | 
			
		||||
 | 
			
		||||
Historically, once a final release is tagged and packages are released,
 | 
			
		||||
versions older than the latest final release are no longer supported.
 | 
			
		||||
However, there is a possibility that a very high severity bug may occur
 | 
			
		||||
in a non-amendment blocked version that is still being run by
 | 
			
		||||
a significant fraction of users, which would necessitate a hotfix / point
 | 
			
		||||
release to that version as well as any later versions.
 | 
			
		||||
 | 
			
		||||
This scenario would follow the same basic procedure as above,
 | 
			
		||||
except that *none* of `develop`, `release`, or `master`
 | 
			
		||||
would be touched during the release process.
 | 
			
		||||
 | 
			
		||||
In this example, consider if version 2.1.1 needed to be patched.
 | 
			
		||||
 | 
			
		||||
1. Create two branches in the main (`upstream`) repo.
 | 
			
		||||
```
 | 
			
		||||
git fetch upstreams
 | 
			
		||||
 | 
			
		||||
# Create a base branch off the tag
 | 
			
		||||
git checkout --no-track -b master-2.1.2 2.1.1
 | 
			
		||||
git push upstream-push
 | 
			
		||||
 | 
			
		||||
# Create a working branch
 | 
			
		||||
git checkout --no-track -b master212-next master-2.1.2
 | 
			
		||||
git push upstream-push
 | 
			
		||||
 | 
			
		||||
git fetch upstreams
 | 
			
		||||
```
 | 
			
		||||
2. Work continues as above, except using `master-2.1.2`as
 | 
			
		||||
   the base branch for any merging, packaging, etc.
 | 
			
		||||
3. After the release is tagged and packages are built, you could
 | 
			
		||||
   potentially delete both branches, e.g. `master-2.1.2` and
 | 
			
		||||
   `master212-next`. However, it may be useful to keep `master-2.1.2`
 | 
			
		||||
   around indefinitely for reference.
 | 
			
		||||
4. Assuming that a hotfix is also released for the latest
 | 
			
		||||
   version in parallel with this one, or if the issue is
 | 
			
		||||
   already fixed in the latest version, do no do any
 | 
			
		||||
   reverse merges. However, if it is not, it probably makes
 | 
			
		||||
   sense to reverse merge `master-2.1.2` into `master`,
 | 
			
		||||
   release a hotfix for _that_ version, then reverse merge
 | 
			
		||||
   from `master` to `develop`. (Please don't do this unless absolutely
 | 
			
		||||
   necessary.)
 | 
			
		||||
 | 
			
		||||
[contrib]: https://docs.github.com/en/get-started/quickstart/contributing-to-projects
 | 
			
		||||
[squash]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/about-pull-request-merges#squash-and-merge-your-commits
 | 
			
		||||
[forking]: https://github.com/XRPLF/rippled/fork
 | 
			
		||||
[rippled]: https://github.com/XRPLF/rippled
 | 
			
		||||
[signing]: https://docs.github.com/en/authentication/managing-commit-signature-verification/about-commit-signature-verification
 | 
			
		||||
[setup-upstreams]: ./bin/git/setup-upstreams.sh
 | 
			
		||||
[squash-branches]: ./bin/git/squash-branches.sh
 | 
			
		||||
[update-version]: ./bin/git/update-version.sh
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,5 @@
 | 
			
		||||
[](https://codecov.io/gh/XRPLF/rippled)
 | 
			
		||||
 | 
			
		||||
# The XRP Ledger
 | 
			
		||||
 | 
			
		||||
The [XRP Ledger](https://xrpl.org/) is a decentralized cryptographic ledger powered by a network of peer-to-peer nodes. The XRP Ledger uses a novel Byzantine Fault Tolerant consensus algorithm to settle and record transactions in a secure distributed database without a central operator.
 | 
			
		||||
@@ -8,7 +10,7 @@ The [XRP Ledger](https://xrpl.org/) is a decentralized cryptographic ledger powe
 | 
			
		||||
## rippled
 | 
			
		||||
The server software that powers the XRP Ledger is called `rippled` and is available in this repository under the permissive [ISC open-source license](LICENSE.md). The `rippled` server software is written primarily in C++ and runs on a variety of platforms. The `rippled` server software can run in several modes depending on its [configuration](https://xrpl.org/rippled-server-modes.html).
 | 
			
		||||
 | 
			
		||||
If you are interested in running an **API Server** (including a **Full History Server**) or a **Reporting Mode** server, take a look at [Clio](https://github.com/XRPLF/clio). rippled Reporting Mode is expected to be replaced by Clio.
 | 
			
		||||
If you are interested in running an **API Server** (including a **Full History Server**), take a look at [Clio](https://github.com/XRPLF/clio). (rippled Reporting Mode has been replaced by Clio.)
 | 
			
		||||
 | 
			
		||||
### Build from Source
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4164
									
								
								RELEASENOTES.md
									
									
									
									
									
								
							
							
						
						
									
										4164
									
								
								RELEASENOTES.md
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -83,7 +83,7 @@ To report a qualifying bug, please send a detailed report to:
 | 
			
		||||
|Long Key ID  | `0xCD49A0AFC57929BE`                                |
 | 
			
		||||
|Fingerprint  | `24E6 3B02 37E0 FA9C 5E96 8974 CD49 A0AF C579 29BE` |
 | 
			
		||||
 | 
			
		||||
The full PGP key for this address, which is also available on several key servers (e.g. on [keys.gnupg.net](https://keys.gnupg.net)), is: 
 | 
			
		||||
The full PGP key for this address, which is also available on several key servers (e.g. on [keyserver.ubuntu.com](https://keyserver.ubuntu.com)), is: 
 | 
			
		||||
```
 | 
			
		||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
 | 
			
		||||
mQINBFUwGHYBEAC0wpGpBPkd8W1UdQjg9+cEFzeIEJRaoZoeuJD8mofwI5Ejnjdt
 | 
			
		||||
 
 | 
			
		||||
@@ -1,24 +0,0 @@
 | 
			
		||||
In this directory are two scripts, `build.sh` and `test.sh` used for building
 | 
			
		||||
and testing rippled.
 | 
			
		||||
 | 
			
		||||
(For now, they assume Bash and Linux. Once I get Windows containers for
 | 
			
		||||
testing, I'll try them there, but if Bash is not available, then they will
 | 
			
		||||
soon be joined by PowerShell scripts `build.ps` and `test.ps`.)
 | 
			
		||||
 | 
			
		||||
We don't want these scripts to require arcane invocations that can only be
 | 
			
		||||
pieced together from within a CI configuration. We want something that humans
 | 
			
		||||
can easily invoke, read, and understand, for when we eventually have to test
 | 
			
		||||
and debug them interactively. That means:
 | 
			
		||||
 | 
			
		||||
(1) They should work with no arguments.
 | 
			
		||||
(2) They should document their arguments.
 | 
			
		||||
(3) They should expand short arguments into long arguments.
 | 
			
		||||
 | 
			
		||||
While we want to provide options for common use cases, we don't need to offer
 | 
			
		||||
the kitchen sink. We can rightfully expect users with esoteric, complicated
 | 
			
		||||
needs to write their own scripts.
 | 
			
		||||
 | 
			
		||||
To make argument-handling easy for us, the implementers, we can just take all
 | 
			
		||||
arguments from environment variables. They have the nice advantage that every
 | 
			
		||||
command-line uses named arguments. For the benefit of us and our users, we
 | 
			
		||||
document those variables at the top of each script.
 | 
			
		||||
@@ -1,31 +0,0 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
set -o xtrace
 | 
			
		||||
set -o errexit
 | 
			
		||||
 | 
			
		||||
# The build system. Either 'Unix Makefiles' or 'Ninja'.
 | 
			
		||||
GENERATOR=${GENERATOR:-Unix Makefiles}
 | 
			
		||||
# The compiler. Either 'gcc' or 'clang'.
 | 
			
		||||
COMPILER=${COMPILER:-gcc}
 | 
			
		||||
# The build type. Either 'Debug' or 'Release'.
 | 
			
		||||
BUILD_TYPE=${BUILD_TYPE:-Debug}
 | 
			
		||||
# Additional arguments to CMake.
 | 
			
		||||
# We use the `-` substitution here instead of `:-` so that callers can erase
 | 
			
		||||
# the default by setting `$CMAKE_ARGS` to the empty string.
 | 
			
		||||
CMAKE_ARGS=${CMAKE_ARGS-'-Dwerr=ON'}
 | 
			
		||||
 | 
			
		||||
# https://gitlab.kitware.com/cmake/cmake/issues/18865
 | 
			
		||||
CMAKE_ARGS="-DBoost_NO_BOOST_CMAKE=ON ${CMAKE_ARGS}"
 | 
			
		||||
 | 
			
		||||
if [[ ${COMPILER} == 'gcc' ]]; then
 | 
			
		||||
  export CC='gcc'
 | 
			
		||||
  export CXX='g++'
 | 
			
		||||
elif [[ ${COMPILER} == 'clang' ]]; then
 | 
			
		||||
  export CC='clang'
 | 
			
		||||
  export CXX='clang++'
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
mkdir build
 | 
			
		||||
cd build
 | 
			
		||||
cmake -G "${GENERATOR}" -DCMAKE_BUILD_TYPE=${BUILD_TYPE} ${CMAKE_ARGS} ..
 | 
			
		||||
cmake --build . -- -j $(nproc)
 | 
			
		||||
@@ -1,41 +0,0 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
set -o xtrace
 | 
			
		||||
set -o errexit
 | 
			
		||||
 | 
			
		||||
# Set to 'true' to run the known "manual" tests in rippled.
 | 
			
		||||
MANUAL_TESTS=${MANUAL_TESTS:-false}
 | 
			
		||||
# The maximum number of concurrent tests.
 | 
			
		||||
CONCURRENT_TESTS=${CONCURRENT_TESTS:-$(nproc)}
 | 
			
		||||
# The path to rippled.
 | 
			
		||||
RIPPLED=${RIPPLED:-build/rippled}
 | 
			
		||||
# Additional arguments to rippled.
 | 
			
		||||
RIPPLED_ARGS=${RIPPLED_ARGS:-}
 | 
			
		||||
 | 
			
		||||
function join_by { local IFS="$1"; shift; echo "$*"; }
 | 
			
		||||
 | 
			
		||||
declare -a manual_tests=(
 | 
			
		||||
  'beast.chrono.abstract_clock'
 | 
			
		||||
  'beast.unit_test.print'
 | 
			
		||||
  'ripple.NodeStore.Timing'
 | 
			
		||||
  'ripple.app.Flow_manual'
 | 
			
		||||
  'ripple.app.NoRippleCheckLimits'
 | 
			
		||||
  'ripple.app.PayStrandAllPairs'
 | 
			
		||||
  'ripple.consensus.ByzantineFailureSim'
 | 
			
		||||
  'ripple.consensus.DistributedValidators'
 | 
			
		||||
  'ripple.consensus.ScaleFreeSim'
 | 
			
		||||
  'ripple.tx.CrossingLimits'
 | 
			
		||||
  'ripple.tx.FindOversizeCross'
 | 
			
		||||
  'ripple.tx.Offer_manual'
 | 
			
		||||
  'ripple.tx.OversizeMeta'
 | 
			
		||||
  'ripple.tx.PlumpBook'
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
if [[ ${MANUAL_TESTS} == 'true' ]]; then
 | 
			
		||||
  RIPPLED_ARGS+=" --unittest=$(join_by , "${manual_tests[@]}")"
 | 
			
		||||
else
 | 
			
		||||
  RIPPLED_ARGS+=" --unittest --quiet --unittest-log"
 | 
			
		||||
fi
 | 
			
		||||
RIPPLED_ARGS+=" --unittest-jobs ${CONCURRENT_TESTS}"
 | 
			
		||||
 | 
			
		||||
${RIPPLED} ${RIPPLED_ARGS}
 | 
			
		||||
@@ -1,274 +0,0 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
set -ex
 | 
			
		||||
 | 
			
		||||
function version_ge() { test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" == "$1"; }
 | 
			
		||||
 | 
			
		||||
__dirname=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
 | 
			
		||||
echo "using CC: ${CC}"
 | 
			
		||||
"${CC}" --version
 | 
			
		||||
export CC
 | 
			
		||||
 | 
			
		||||
COMPNAME=$(basename $CC)
 | 
			
		||||
echo "using CXX: ${CXX:-notset}"
 | 
			
		||||
if [[ $CXX ]]; then
 | 
			
		||||
   "${CXX}" --version
 | 
			
		||||
   export CXX
 | 
			
		||||
fi
 | 
			
		||||
: ${BUILD_TYPE:=Debug}
 | 
			
		||||
echo "BUILD TYPE: ${BUILD_TYPE}"
 | 
			
		||||
 | 
			
		||||
: ${TARGET:=install}
 | 
			
		||||
echo "BUILD TARGET: ${TARGET}"
 | 
			
		||||
 | 
			
		||||
JOBS=${NUM_PROCESSORS:-2}
 | 
			
		||||
if [[ ${TRAVIS:-false} != "true" ]]; then
 | 
			
		||||
    JOBS=$((JOBS+1))
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [[ ! -z "${CMAKE_EXE:-}" ]] ; then
 | 
			
		||||
    export PATH="$(dirname ${CMAKE_EXE}):$PATH"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ -x /usr/bin/time ] ; then
 | 
			
		||||
    : ${TIME:="Duration: %E"}
 | 
			
		||||
    export TIME
 | 
			
		||||
    time=/usr/bin/time
 | 
			
		||||
else
 | 
			
		||||
    time=
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
echo "Building rippled"
 | 
			
		||||
: ${CMAKE_EXTRA_ARGS:=""}
 | 
			
		||||
if [[ ${NINJA_BUILD:-} == true ]]; then
 | 
			
		||||
    CMAKE_EXTRA_ARGS+=" -G Ninja"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
coverage=false
 | 
			
		||||
if [[ "${TARGET}" == "coverage" ]] ; then
 | 
			
		||||
    echo "coverage option detected."
 | 
			
		||||
    coverage=true
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
cmake --version
 | 
			
		||||
CMAKE_VER=$(cmake --version | cut -d " " -f 3 | head -1)
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# allow explicit setting of the name of the build
 | 
			
		||||
# dir, otherwise default to the compiler.build_type
 | 
			
		||||
#
 | 
			
		||||
: "${BUILD_DIR:=${COMPNAME}.${BUILD_TYPE}}"
 | 
			
		||||
BUILDARGS="--target ${TARGET}"
 | 
			
		||||
BUILDTOOLARGS=""
 | 
			
		||||
if version_ge $CMAKE_VER "3.12.0" ; then
 | 
			
		||||
    BUILDARGS+=" --parallel"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [[ ${NINJA_BUILD:-} == false ]]; then
 | 
			
		||||
    if version_ge $CMAKE_VER "3.12.0" ; then
 | 
			
		||||
        BUILDARGS+=" ${JOBS}"
 | 
			
		||||
    else
 | 
			
		||||
        BUILDTOOLARGS+=" -j ${JOBS}"
 | 
			
		||||
    fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [[ ${VERBOSE_BUILD:-} == true ]]; then
 | 
			
		||||
    CMAKE_EXTRA_ARGS+=" -DCMAKE_VERBOSE_MAKEFILE=ON"
 | 
			
		||||
    if version_ge $CMAKE_VER "3.14.0" ; then
 | 
			
		||||
        BUILDARGS+=" --verbose"
 | 
			
		||||
    else
 | 
			
		||||
        if [[ ${NINJA_BUILD:-} == false ]]; then
 | 
			
		||||
            BUILDTOOLARGS+=" verbose=1"
 | 
			
		||||
        else
 | 
			
		||||
            BUILDTOOLARGS+=" -v"
 | 
			
		||||
        fi
 | 
			
		||||
    fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [[ ${USE_CCACHE:-} == true ]]; then
 | 
			
		||||
    echo "using ccache with basedir [${CCACHE_BASEDIR:-}]"
 | 
			
		||||
    CMAKE_EXTRA_ARGS+=" -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache"
 | 
			
		||||
fi
 | 
			
		||||
if [ -d "build/${BUILD_DIR}" ]; then
 | 
			
		||||
    rm -rf "build/${BUILD_DIR}"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
mkdir -p "build/${BUILD_DIR}"
 | 
			
		||||
pushd "build/${BUILD_DIR}"
 | 
			
		||||
 | 
			
		||||
# cleanup possible artifacts
 | 
			
		||||
rm -fv CMakeFiles/CMakeOutput.log CMakeFiles/CMakeError.log
 | 
			
		||||
# Clean up NIH directories which should be git repos, but aren't
 | 
			
		||||
for nih_path in ${NIH_CACHE_ROOT}/*/*/*/src ${NIH_CACHE_ROOT}/*/*/src
 | 
			
		||||
do
 | 
			
		||||
  for dir in lz4 snappy rocksdb
 | 
			
		||||
  do
 | 
			
		||||
    if [ -e ${nih_path}/${dir} -a \! -e ${nih_path}/${dir}/.git ]
 | 
			
		||||
    then
 | 
			
		||||
      ls -la ${nih_path}/${dir}*
 | 
			
		||||
      rm -rfv ${nih_path}/${dir}*
 | 
			
		||||
    fi
 | 
			
		||||
  done
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
# generate
 | 
			
		||||
${time} cmake ../.. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} ${CMAKE_EXTRA_ARGS}
 | 
			
		||||
# Display the cmake output, to help with debugging if something fails
 | 
			
		||||
for file in CMakeOutput.log CMakeError.log
 | 
			
		||||
do
 | 
			
		||||
  if [ -f CMakeFiles/${file} ]
 | 
			
		||||
  then
 | 
			
		||||
    ls -l CMakeFiles/${file}
 | 
			
		||||
    cat CMakeFiles/${file}
 | 
			
		||||
  fi
 | 
			
		||||
done
 | 
			
		||||
# build
 | 
			
		||||
export DESTDIR=$(pwd)/_INSTALLED_
 | 
			
		||||
 | 
			
		||||
${time} eval cmake --build . ${BUILDARGS} -- ${BUILDTOOLARGS}
 | 
			
		||||
 | 
			
		||||
if [[ ${TARGET} == "docs" ]]; then
 | 
			
		||||
    ## mimic the standard test output for docs build
 | 
			
		||||
    ## to make controlling processes like jenkins happy
 | 
			
		||||
    if [ -f docs/html/index.html ]; then
 | 
			
		||||
        echo "1 case, 1 test total, 0 failures"
 | 
			
		||||
    else
 | 
			
		||||
        echo "1 case, 1 test total, 1 failures"
 | 
			
		||||
    fi
 | 
			
		||||
    exit
 | 
			
		||||
fi
 | 
			
		||||
popd
 | 
			
		||||
 | 
			
		||||
if [[ "${TARGET}" == "validator-keys" ]] ; then
 | 
			
		||||
    export APP_PATH="$PWD/build/${BUILD_DIR}/validator-keys/validator-keys"
 | 
			
		||||
else
 | 
			
		||||
    export APP_PATH="$PWD/build/${BUILD_DIR}/rippled"
 | 
			
		||||
fi
 | 
			
		||||
echo "using APP_PATH: ${APP_PATH}"
 | 
			
		||||
 | 
			
		||||
# See what we've actually built
 | 
			
		||||
ldd ${APP_PATH}
 | 
			
		||||
 | 
			
		||||
: ${APP_ARGS:=}
 | 
			
		||||
 | 
			
		||||
if [[ "${TARGET}" == "validator-keys" ]] ; then
 | 
			
		||||
    APP_ARGS="--unittest"
 | 
			
		||||
else
 | 
			
		||||
    function join_by { local IFS="$1"; shift; echo "$*"; }
 | 
			
		||||
 | 
			
		||||
    # This is a list of manual tests
 | 
			
		||||
    # in rippled that we want to run
 | 
			
		||||
    # ORDER matters here...sorted in approximately
 | 
			
		||||
    # descending execution time (longest running tests at top)
 | 
			
		||||
    declare -a manual_tests=(
 | 
			
		||||
        'ripple.ripple_data.reduce_relay_simulate'
 | 
			
		||||
        'ripple.tx.Offer_manual'
 | 
			
		||||
        'ripple.tx.CrossingLimits'
 | 
			
		||||
        'ripple.tx.PlumpBook'
 | 
			
		||||
        'ripple.app.Flow_manual'
 | 
			
		||||
        'ripple.tx.OversizeMeta'
 | 
			
		||||
        'ripple.consensus.DistributedValidators'
 | 
			
		||||
        'ripple.app.NoRippleCheckLimits'
 | 
			
		||||
        'ripple.ripple_data.compression'
 | 
			
		||||
        'ripple.NodeStore.Timing'
 | 
			
		||||
        'ripple.consensus.ByzantineFailureSim'
 | 
			
		||||
        'beast.chrono.abstract_clock'
 | 
			
		||||
        'beast.unit_test.print'
 | 
			
		||||
    )
 | 
			
		||||
    if [[ ${TRAVIS:-false} != "true" ]]; then
 | 
			
		||||
        # these two tests cause travis CI to run out of memory.
 | 
			
		||||
        # TODO: investigate possible workarounds.
 | 
			
		||||
        manual_tests=(
 | 
			
		||||
            'ripple.consensus.ScaleFreeSim'
 | 
			
		||||
            'ripple.tx.FindOversizeCross'
 | 
			
		||||
            "${manual_tests[@]}"
 | 
			
		||||
        )
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    if [[ ${MANUAL_TESTS:-} == true ]]; then
 | 
			
		||||
        APP_ARGS+=" --unittest=$(join_by , "${manual_tests[@]}")"
 | 
			
		||||
    else
 | 
			
		||||
        APP_ARGS+=" --unittest --quiet --unittest-log"
 | 
			
		||||
    fi
 | 
			
		||||
    if [[ ${coverage} == false && ${PARALLEL_TESTS:-} == true ]]; then
 | 
			
		||||
        APP_ARGS+=" --unittest-jobs ${JOBS}"
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    if [[ ${IPV6_TESTS:-} == true ]]; then
 | 
			
		||||
        APP_ARGS+=" --unittest-ipv6"
 | 
			
		||||
    fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [[ ${coverage} == true && $CC =~ ^gcc ]]; then
 | 
			
		||||
    # Push the results (lcov.info) to codecov
 | 
			
		||||
    codecov -X gcov # don't even try and look for .gcov files ;)
 | 
			
		||||
    find . -name "*.gcda" | xargs rm -f
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [[ ${SKIP_TESTS:-} == true ]]; then
 | 
			
		||||
    echo "skipping tests."
 | 
			
		||||
    exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
ulimit -a
 | 
			
		||||
corepat=$(cat /proc/sys/kernel/core_pattern)
 | 
			
		||||
if [[ ${corepat} =~ ^[:space:]*\| ]] ; then
 | 
			
		||||
    echo "WARNING: core pattern is piping - can't search for core files"
 | 
			
		||||
    look_core=false
 | 
			
		||||
else
 | 
			
		||||
    look_core=true
 | 
			
		||||
    coredir=$(dirname ${corepat})
 | 
			
		||||
fi
 | 
			
		||||
if [[ ${look_core} == true ]]; then
 | 
			
		||||
    before=$(ls -A1 ${coredir})
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
set +e
 | 
			
		||||
echo "Running tests for ${APP_PATH}"
 | 
			
		||||
if [[ ${MANUAL_TESTS:-} == true && ${PARALLEL_TESTS:-} != true ]]; then
 | 
			
		||||
    for t in "${manual_tests[@]}" ; do
 | 
			
		||||
        ${APP_PATH} --unittest=${t}
 | 
			
		||||
        TEST_STAT=$?
 | 
			
		||||
        if [[ $TEST_STAT -ne 0 ]] ; then
 | 
			
		||||
            break
 | 
			
		||||
        fi
 | 
			
		||||
    done
 | 
			
		||||
else
 | 
			
		||||
    ${APP_PATH} ${APP_ARGS}
 | 
			
		||||
    TEST_STAT=$?
 | 
			
		||||
fi
 | 
			
		||||
set -e
 | 
			
		||||
 | 
			
		||||
if [[ ${look_core} == true ]]; then
 | 
			
		||||
    after=$(ls -A1 ${coredir})
 | 
			
		||||
    oIFS="${IFS}"
 | 
			
		||||
    IFS=$'\n\r'
 | 
			
		||||
    found_core=false
 | 
			
		||||
    for l in $(diff -w --suppress-common-lines <(echo "$before") <(echo "$after")) ; do
 | 
			
		||||
        if [[ "$l" =~ ^[[:space:]]*\>[[:space:]]*(.+)$ ]] ; then
 | 
			
		||||
            corefile="${BASH_REMATCH[1]}"
 | 
			
		||||
            echo "FOUND core dump file at '${coredir}/${corefile}'"
 | 
			
		||||
            gdb_output=$(/bin/mktemp /tmp/gdb_output_XXXXXXXXXX.txt)
 | 
			
		||||
            found_core=true
 | 
			
		||||
            gdb \
 | 
			
		||||
                -ex "set height 0" \
 | 
			
		||||
                -ex "set logging file ${gdb_output}" \
 | 
			
		||||
                -ex "set logging on" \
 | 
			
		||||
                -ex "print 'ripple::BuildInfo::versionString'" \
 | 
			
		||||
                -ex "thread apply all backtrace full" \
 | 
			
		||||
                -ex "info inferiors" \
 | 
			
		||||
                -ex quit \
 | 
			
		||||
                "$APP_PATH" \
 | 
			
		||||
                "${coredir}/${corefile}" &> /dev/null
 | 
			
		||||
 | 
			
		||||
            echo -e "CORE INFO: \n\n $(cat ${gdb_output}) \n\n)"
 | 
			
		||||
        fi
 | 
			
		||||
    done
 | 
			
		||||
    IFS="${oIFS}"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [[ ${found_core} == true ]]; then
 | 
			
		||||
    exit -1
 | 
			
		||||
else
 | 
			
		||||
    exit $TEST_STAT
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
@@ -1,36 +0,0 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
# run our build script in a docker container
 | 
			
		||||
# using travis-ci hosts
 | 
			
		||||
set -eux
 | 
			
		||||
 | 
			
		||||
function join_by { local IFS="$1"; shift; echo "$*"; }
 | 
			
		||||
 | 
			
		||||
set +x
 | 
			
		||||
echo "VERBOSE_BUILD=true" > /tmp/co.env
 | 
			
		||||
matchers=(
 | 
			
		||||
   'TRAVIS.*' 'CI' 'CC' 'CXX'
 | 
			
		||||
   'BUILD_TYPE' 'TARGET' 'MAX_TIME'
 | 
			
		||||
   'CODECOV.+' 'CMAKE.*' '.+_TESTS'
 | 
			
		||||
   '.+_OPTIONS' 'NINJA.*' 'NUM_.+'
 | 
			
		||||
   'NIH_.+' 'BOOST.*' '.*CCACHE.*')
 | 
			
		||||
 | 
			
		||||
matchstring=$(join_by '|' "${matchers[@]}")
 | 
			
		||||
echo "MATCHSTRING IS:: $matchstring"
 | 
			
		||||
env | grep -E "^(${matchstring})=" >> /tmp/co.env
 | 
			
		||||
set -x
 | 
			
		||||
# need to eliminate TRAVIS_CMD...don't want to pass it to the container
 | 
			
		||||
cat /tmp/co.env | grep -v TRAVIS_CMD > /tmp/co.env.2
 | 
			
		||||
mv /tmp/co.env.2 /tmp/co.env
 | 
			
		||||
cat /tmp/co.env
 | 
			
		||||
mkdir -p -m 0777 ${TRAVIS_BUILD_DIR}/cores
 | 
			
		||||
echo "${TRAVIS_BUILD_DIR}/cores/%e.%p" | sudo tee /proc/sys/kernel/core_pattern
 | 
			
		||||
docker run \
 | 
			
		||||
    -t --env-file /tmp/co.env \
 | 
			
		||||
    -v ${TRAVIS_HOME}:${TRAVIS_HOME} \
 | 
			
		||||
    -w ${TRAVIS_BUILD_DIR} \
 | 
			
		||||
    --cap-add SYS_PTRACE \
 | 
			
		||||
    --ulimit "core=-1" \
 | 
			
		||||
    $DOCKER_IMAGE \
 | 
			
		||||
    /bin/bash -c 'if [[ $CC =~ ([[:alpha:]]+)-([[:digit:].]+) ]] ; then sudo update-alternatives --set ${BASH_REMATCH[1]} /usr/bin/$CC; fi; bin/ci/ubuntu/build-and-test.sh'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -1,44 +0,0 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
# some cached files create churn, so save them here for
 | 
			
		||||
# later restoration before packing the cache
 | 
			
		||||
set -eux
 | 
			
		||||
clean_cache="travis_clean_cache"
 | 
			
		||||
if [[ ! ( "${TRAVIS_JOB_NAME}" =~ "windows" || \
 | 
			
		||||
    "${TRAVIS_JOB_NAME}" =~ "prereq-keep" ) ]] && \
 | 
			
		||||
    ( [[ "${TRAVIS_COMMIT_MESSAGE}" =~ "${clean_cache}" ]] || \
 | 
			
		||||
        ( [[ -v TRAVIS_PULL_REQUEST_SHA && \
 | 
			
		||||
            "${TRAVIS_PULL_REQUEST_SHA}" != "" ]] && \
 | 
			
		||||
          git log -1 "${TRAVIS_PULL_REQUEST_SHA}" | grep -cq "${clean_cache}" -
 | 
			
		||||
        )
 | 
			
		||||
    )
 | 
			
		||||
then
 | 
			
		||||
    find ${TRAVIS_HOME}/_cache -maxdepth 2 -type d
 | 
			
		||||
    rm -rf ${TRAVIS_HOME}/_cache
 | 
			
		||||
    mkdir -p ${TRAVIS_HOME}/_cache
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
pushd ${TRAVIS_HOME}
 | 
			
		||||
if [ -f cache_ignore.tar ] ; then
 | 
			
		||||
    rm -f cache_ignore.tar
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ -d _cache/nih_c ] ; then
 | 
			
		||||
    find _cache/nih_c -name "build.ninja" | tar rf cache_ignore.tar --files-from -
 | 
			
		||||
    find _cache/nih_c -name ".ninja_deps" | tar rf cache_ignore.tar --files-from -
 | 
			
		||||
    find _cache/nih_c -name ".ninja_log" | tar rf cache_ignore.tar --files-from -
 | 
			
		||||
    find _cache/nih_c -name "*.log" | tar rf cache_ignore.tar --files-from -
 | 
			
		||||
    find _cache/nih_c -name "*.tlog" | tar rf cache_ignore.tar --files-from -
 | 
			
		||||
    # show .a files in the cache, for sanity checking
 | 
			
		||||
    find _cache/nih_c -name "*.a" -ls
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ -d _cache/ccache ] ; then
 | 
			
		||||
    find _cache/ccache -name "stats" | tar rf cache_ignore.tar --files-from -
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ -f cache_ignore.tar ] ; then
 | 
			
		||||
    tar -tf cache_ignore.tar
 | 
			
		||||
fi
 | 
			
		||||
popd
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										86
									
								
								bin/git/setup-upstreams.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										86
									
								
								bin/git/setup-upstreams.sh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,86 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
if [[ $# -ne 1 || "$1" == "--help" || "$1" == "-h" ]]
 | 
			
		||||
then
 | 
			
		||||
  name=$( basename $0 )
 | 
			
		||||
  cat <<- USAGE
 | 
			
		||||
  Usage: $name <username>
 | 
			
		||||
  
 | 
			
		||||
  Where <username> is the Github username of the upstream repo. e.g. XRPLF
 | 
			
		||||
USAGE
 | 
			
		||||
  exit 0
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Create upstream remotes based on origin
 | 
			
		||||
shift
 | 
			
		||||
user="$1"
 | 
			
		||||
# Get the origin URL. Expect it be an SSH-style URL
 | 
			
		||||
origin=$( git remote get-url origin )
 | 
			
		||||
if [[ "${origin}" == "" ]]
 | 
			
		||||
then
 | 
			
		||||
  echo Invalid origin remote >&2
 | 
			
		||||
  exit 1
 | 
			
		||||
fi
 | 
			
		||||
# echo "Origin: ${origin}"
 | 
			
		||||
# Parse the origin
 | 
			
		||||
ifs_orig="${IFS}"
 | 
			
		||||
IFS=':' read remote originpath <<< "${origin}"
 | 
			
		||||
# echo "Remote: ${remote}, Originpath: ${originpath}"
 | 
			
		||||
IFS='@' read sshuser server <<< "${remote}"
 | 
			
		||||
# echo "SSHUser: ${sshuser}, Server: ${server}"
 | 
			
		||||
IFS='/' read originuser repo <<< "${originpath}"
 | 
			
		||||
# echo "Originuser: ${originuser}, Repo: ${repo}"
 | 
			
		||||
if [[ "${sshuser}" == "" || "${server}" == "" || "${originuser}" == ""
 | 
			
		||||
  || "${repo}" == "" ]]
 | 
			
		||||
then
 | 
			
		||||
  echo "Can't parse origin URL: ${origin}" >&2
 | 
			
		||||
  exit 1
 | 
			
		||||
fi
 | 
			
		||||
upstream="https://${server}/${user}/${repo}"
 | 
			
		||||
upstreampush="${remote}:${user}/${repo}"
 | 
			
		||||
upstreamgroup="upstream upstream-push"
 | 
			
		||||
current=$( git remote get-url upstream 2>/dev/null )
 | 
			
		||||
currentpush=$( git remote get-url upstream-push 2>/dev/null )
 | 
			
		||||
currentgroup=$( git config remotes.upstreams )
 | 
			
		||||
if [[ "${current}" == "${upstream}" ]]
 | 
			
		||||
then
 | 
			
		||||
  echo "Upstream already set up correctly. Skip"
 | 
			
		||||
elif [[ -n "${current}" && "${current}" != "${upstream}" &&
 | 
			
		||||
  "${current}" != "${upstreampush}" ]]
 | 
			
		||||
then
 | 
			
		||||
  echo "Upstream already set up as: ${current}. Skip"
 | 
			
		||||
else
 | 
			
		||||
  if [[ "${current}" == "${upstreampush}" ]]
 | 
			
		||||
  then
 | 
			
		||||
    echo "Upstream set to dangerous push URL. Update."
 | 
			
		||||
    _run git remote rename upstream upstream-push || \
 | 
			
		||||
    _run git remote remove upstream
 | 
			
		||||
    currentpush=$( git remote get-url upstream-push 2>/dev/null )
 | 
			
		||||
  fi
 | 
			
		||||
  _run git remote add upstream "${upstream}"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [[ "${currentpush}" == "${upstreampush}" ]]
 | 
			
		||||
then
 | 
			
		||||
  echo "upstream-push already set up correctly. Skip"
 | 
			
		||||
elif [[ -n "${currentpush}" && "${currentpush}" != "${upstreampush}" ]]
 | 
			
		||||
then
 | 
			
		||||
  echo "upstream-push already set up as: ${currentpush}. Skip"
 | 
			
		||||
else
 | 
			
		||||
  _run git remote add upstream-push "${upstreampush}"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [[ "${currentgroup}" == "${upstreamgroup}" ]]
 | 
			
		||||
then
 | 
			
		||||
  echo "Upstreams group already set up correctly. Skip"
 | 
			
		||||
elif [[ -n "${currentgroup}" && "${currentgroup}" != "${upstreamgroup}" ]]
 | 
			
		||||
then
 | 
			
		||||
  echo "Upstreams group already set up as: ${currentgroup}. Skip"
 | 
			
		||||
else
 | 
			
		||||
  _run git config --add remotes.upstreams "${upstreamgroup}"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
_run git fetch --jobs=$(nproc) upstreams
 | 
			
		||||
 | 
			
		||||
exit 0
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										69
									
								
								bin/git/squash-branches.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										69
									
								
								bin/git/squash-branches.sh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,69 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
if [[ $# -lt 3 || "$1" == "--help" || "$1" = "-h" ]]
 | 
			
		||||
then
 | 
			
		||||
  name=$( basename $0 )
 | 
			
		||||
  cat <<- USAGE
 | 
			
		||||
  Usage: $name workbranch base/branch user/branch [user/branch [...]]
 | 
			
		||||
  
 | 
			
		||||
  * workbranch will be created locally from base/branch
 | 
			
		||||
  * base/branch and user/branch may be specified as user:branch to allow
 | 
			
		||||
    easy copying from Github PRs
 | 
			
		||||
  * Remotes for each user must already be set up
 | 
			
		||||
USAGE
 | 
			
		||||
exit 0
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
work="$1"
 | 
			
		||||
shift
 | 
			
		||||
 | 
			
		||||
branches=( $( echo "${@}" | sed "s/:/\//" ) )
 | 
			
		||||
base="${branches[0]}"
 | 
			
		||||
unset branches[0]
 | 
			
		||||
 | 
			
		||||
set -e
 | 
			
		||||
 | 
			
		||||
users=()
 | 
			
		||||
for b in "${branches[@]}"
 | 
			
		||||
do
 | 
			
		||||
  users+=( $( echo $b | cut -d/ -f1 ) )
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
users=( $( printf '%s\n' "${users[@]}" | sort -u ) )
 | 
			
		||||
 | 
			
		||||
git fetch --multiple upstreams "${users[@]}"
 | 
			
		||||
git checkout -B "$work" --no-track "$base"
 | 
			
		||||
 | 
			
		||||
for b in "${branches[@]}"
 | 
			
		||||
do
 | 
			
		||||
  git merge --squash "${b}"
 | 
			
		||||
  git commit -S # Use the commit message provided on the PR
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
# Make sure the commits look right
 | 
			
		||||
git log --show-signature "$base..HEAD"
 | 
			
		||||
 | 
			
		||||
parts=( $( echo $base | sed "s/\// /" ) )
 | 
			
		||||
repo="${parts[0]}"
 | 
			
		||||
b="${parts[1]}"
 | 
			
		||||
push=$repo
 | 
			
		||||
if [[ "$push" == "upstream" ]]
 | 
			
		||||
then
 | 
			
		||||
  push="upstream-push"
 | 
			
		||||
fi
 | 
			
		||||
if [[ "$repo" == "upstream" ]]
 | 
			
		||||
then
 | 
			
		||||
  repo="upstreams"
 | 
			
		||||
fi
 | 
			
		||||
cat << PUSH
 | 
			
		||||
 | 
			
		||||
-------------------------------------------------------------------
 | 
			
		||||
This script will not push. Verify everything is correct, then push
 | 
			
		||||
to your repo, and create a PR if necessary. Once the PR is approved,
 | 
			
		||||
run:
 | 
			
		||||
 | 
			
		||||
git push $push HEAD:$b
 | 
			
		||||
git fetch $repo
 | 
			
		||||
-------------------------------------------------------------------
 | 
			
		||||
PUSH
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										58
									
								
								bin/git/update-version.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										58
									
								
								bin/git/update-version.sh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,58 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
if [[ $# -ne 3 || "$1" == "--help" || "$1" = "-h" ]]
 | 
			
		||||
then
 | 
			
		||||
  name=$( basename $0 )
 | 
			
		||||
  cat <<- USAGE
 | 
			
		||||
  Usage: $name workbranch base/branch version
 | 
			
		||||
 | 
			
		||||
  * workbranch will be created locally from base/branch. If it exists,
 | 
			
		||||
    it will be reused, so make sure you don't overwrite any work.
 | 
			
		||||
  * base/branch may be specified as user:branch to allow easy copying
 | 
			
		||||
    from Github PRs.
 | 
			
		||||
USAGE
 | 
			
		||||
exit 0
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
work="$1"
 | 
			
		||||
shift
 | 
			
		||||
 | 
			
		||||
base=$( echo "$1" | sed "s/:/\//" )
 | 
			
		||||
shift
 | 
			
		||||
 | 
			
		||||
version=$1
 | 
			
		||||
shift
 | 
			
		||||
 | 
			
		||||
set -e
 | 
			
		||||
 | 
			
		||||
git fetch upstreams
 | 
			
		||||
 | 
			
		||||
git checkout -B "${work}" --no-track "${base}"
 | 
			
		||||
 | 
			
		||||
push=$( git rev-parse --abbrev-ref --symbolic-full-name '@{push}' \
 | 
			
		||||
              2>/dev/null ) || true
 | 
			
		||||
if [[ "${push}" != "" ]]
 | 
			
		||||
then
 | 
			
		||||
  echo "Warning: ${push} may already exist."
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
build=$( find -name BuildInfo.cpp )
 | 
			
		||||
sed 's/\(^.*versionString =\).*$/\1 "'${version}'"/' ${build} > version.cpp && \
 | 
			
		||||
diff "${build}" version.cpp && exit 1 || \
 | 
			
		||||
mv -vi version.cpp ${build}
 | 
			
		||||
 | 
			
		||||
git diff
 | 
			
		||||
 | 
			
		||||
git add ${build}
 | 
			
		||||
 | 
			
		||||
git commit -S -m "Set version to ${version}"
 | 
			
		||||
 | 
			
		||||
git log --oneline --first-parent ${base}^..
 | 
			
		||||
 | 
			
		||||
cat << PUSH
 | 
			
		||||
 | 
			
		||||
-------------------------------------------------------------------
 | 
			
		||||
This script will not push. Verify everything is correct, then push
 | 
			
		||||
to your repo, and create a PR as described in CONTRIBUTING.md.
 | 
			
		||||
-------------------------------------------------------------------
 | 
			
		||||
PUSH
 | 
			
		||||
							
								
								
									
										218
									
								
								bin/physical.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										218
									
								
								bin/physical.sh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,218 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
set -o errexit
 | 
			
		||||
 | 
			
		||||
marker_base=985c80fbc6131f3a8cedd0da7e8af98dfceb13c7
 | 
			
		||||
marker_commit=${1:-${marker_base}}
 | 
			
		||||
 | 
			
		||||
if [ $(git merge-base ${marker_commit} ${marker_base}) != ${marker_base} ]; then
 | 
			
		||||
  echo "first marker commit not an ancestor: ${marker_commit}"
 | 
			
		||||
  exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ $(git merge-base ${marker_commit} HEAD) != $(git rev-parse --verify ${marker_commit}) ]; then
 | 
			
		||||
  echo "given marker commit not an ancestor: ${marker_commit}"
 | 
			
		||||
  exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ -e Builds/CMake ]; then
 | 
			
		||||
  echo move CMake
 | 
			
		||||
  git mv Builds/CMake cmake
 | 
			
		||||
  git add --update .
 | 
			
		||||
  git commit -m 'Move CMake directory' --author 'Pretty Printer <cpp@ripple.com>'
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ -e src/ripple ]; then
 | 
			
		||||
 | 
			
		||||
  echo move protocol buffers
 | 
			
		||||
  mkdir -p include/xrpl
 | 
			
		||||
  if [ -e src/ripple/proto ]; then
 | 
			
		||||
    git mv src/ripple/proto include/xrpl
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  extract_list() {
 | 
			
		||||
    git show ${marker_commit}:Builds/CMake/RippledCore.cmake | \
 | 
			
		||||
    awk "/END ${1}/ { p = 0 } p && /src\/ripple/; /BEGIN ${1}/ { p = 1 }" | \
 | 
			
		||||
    sed -e 's#src/ripple/##' -e 's#[^a-z]\+$##'
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  move_files() {
 | 
			
		||||
    oldroot="$1"; shift
 | 
			
		||||
    newroot="$1"; shift
 | 
			
		||||
    detail="$1"; shift
 | 
			
		||||
    files=("$@")
 | 
			
		||||
    for file in ${files[@]}; do
 | 
			
		||||
      if [ ! -e ${oldroot}/${file} ]; then
 | 
			
		||||
        continue
 | 
			
		||||
      fi
 | 
			
		||||
      dir=$(dirname ${file})
 | 
			
		||||
      if [ $(basename ${dir}) == 'details' ]; then
 | 
			
		||||
        dir=$(dirname ${dir})
 | 
			
		||||
      fi
 | 
			
		||||
      if [ $(basename ${dir}) == 'impl' ]; then
 | 
			
		||||
        dir="$(dirname ${dir})/${detail}"
 | 
			
		||||
      fi
 | 
			
		||||
      mkdir -p ${newroot}/${dir}
 | 
			
		||||
      git mv ${oldroot}/${file} ${newroot}/${dir}
 | 
			
		||||
    done
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  echo move libxrpl headers
 | 
			
		||||
  files=$(extract_list 'LIBXRPL HEADERS')
 | 
			
		||||
  files+=(
 | 
			
		||||
    basics/SlabAllocator.h
 | 
			
		||||
 | 
			
		||||
    beast/asio/io_latency_probe.h
 | 
			
		||||
    beast/container/aged_container.h
 | 
			
		||||
    beast/container/aged_container_utility.h
 | 
			
		||||
    beast/container/aged_map.h
 | 
			
		||||
    beast/container/aged_multimap.h
 | 
			
		||||
    beast/container/aged_multiset.h
 | 
			
		||||
    beast/container/aged_set.h
 | 
			
		||||
    beast/container/aged_unordered_map.h
 | 
			
		||||
    beast/container/aged_unordered_multimap.h
 | 
			
		||||
    beast/container/aged_unordered_multiset.h
 | 
			
		||||
    beast/container/aged_unordered_set.h
 | 
			
		||||
    beast/container/detail/aged_associative_container.h
 | 
			
		||||
    beast/container/detail/aged_container_iterator.h
 | 
			
		||||
    beast/container/detail/aged_ordered_container.h
 | 
			
		||||
    beast/container/detail/aged_unordered_container.h
 | 
			
		||||
    beast/container/detail/empty_base_optimization.h
 | 
			
		||||
    beast/core/LockFreeStack.h
 | 
			
		||||
    beast/insight/Collector.h
 | 
			
		||||
    beast/insight/Counter.h
 | 
			
		||||
    beast/insight/CounterImpl.h
 | 
			
		||||
    beast/insight/Event.h
 | 
			
		||||
    beast/insight/EventImpl.h
 | 
			
		||||
    beast/insight/Gauge.h
 | 
			
		||||
    beast/insight/GaugeImpl.h
 | 
			
		||||
    beast/insight/Group.h
 | 
			
		||||
    beast/insight/Groups.h
 | 
			
		||||
    beast/insight/Hook.h
 | 
			
		||||
    beast/insight/HookImpl.h
 | 
			
		||||
    beast/insight/Insight.h
 | 
			
		||||
    beast/insight/Meter.h
 | 
			
		||||
    beast/insight/MeterImpl.h
 | 
			
		||||
    beast/insight/NullCollector.h
 | 
			
		||||
    beast/insight/StatsDCollector.h
 | 
			
		||||
    beast/test/fail_counter.h
 | 
			
		||||
    beast/test/fail_stream.h
 | 
			
		||||
    beast/test/pipe_stream.h
 | 
			
		||||
    beast/test/sig_wait.h
 | 
			
		||||
    beast/test/string_iostream.h
 | 
			
		||||
    beast/test/string_istream.h
 | 
			
		||||
    beast/test/string_ostream.h
 | 
			
		||||
    beast/test/test_allocator.h
 | 
			
		||||
    beast/test/yield_to.h
 | 
			
		||||
    beast/utility/hash_pair.h
 | 
			
		||||
    beast/utility/maybe_const.h
 | 
			
		||||
    beast/utility/temp_dir.h
 | 
			
		||||
 | 
			
		||||
    # included by only json/impl/json_assert.h
 | 
			
		||||
    json/json_errors.h
 | 
			
		||||
 | 
			
		||||
    protocol/PayChan.h
 | 
			
		||||
    protocol/RippleLedgerHash.h
 | 
			
		||||
    protocol/messages.h
 | 
			
		||||
    protocol/st.h
 | 
			
		||||
  )
 | 
			
		||||
  files+=(
 | 
			
		||||
    basics/README.md
 | 
			
		||||
    crypto/README.md
 | 
			
		||||
    json/README.md
 | 
			
		||||
    protocol/README.md
 | 
			
		||||
    resource/README.md
 | 
			
		||||
  )
 | 
			
		||||
  move_files src/ripple include/xrpl detail ${files[@]}
 | 
			
		||||
 | 
			
		||||
  echo move libxrpl sources
 | 
			
		||||
  files=$(extract_list 'LIBXRPL SOURCES')
 | 
			
		||||
  move_files src/ripple src/libxrpl "" ${files[@]}
 | 
			
		||||
 | 
			
		||||
  echo check leftovers
 | 
			
		||||
  dirs=$(cd include/xrpl; ls -d */)
 | 
			
		||||
  dirs=$(cd src/ripple; ls -d ${dirs} 2>/dev/null || true)
 | 
			
		||||
  files="$(cd src/ripple; find ${dirs} -type f)"
 | 
			
		||||
  if [ -n "${files}" ]; then
 | 
			
		||||
    echo "leftover files:"
 | 
			
		||||
    echo ${files}
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  echo remove empty directories
 | 
			
		||||
  empty_dirs="$(cd src/ripple; find ${dirs} -depth -type d)"
 | 
			
		||||
  for dir in ${empty_dirs[@]}; do
 | 
			
		||||
    if [ -e ${dir} ]; then
 | 
			
		||||
      rmdir ${dir}
 | 
			
		||||
    fi
 | 
			
		||||
  done
 | 
			
		||||
 | 
			
		||||
  echo move xrpld sources
 | 
			
		||||
  files=$(
 | 
			
		||||
    extract_list 'XRPLD SOURCES'
 | 
			
		||||
    cd src/ripple
 | 
			
		||||
    find * -regex '.*\.\(h\|ipp\|md\|pu\|uml\|png\)'
 | 
			
		||||
  )
 | 
			
		||||
  move_files src/ripple src/xrpld detail ${files[@]}
 | 
			
		||||
 | 
			
		||||
  files="$(cd src/ripple; find . -type f)"
 | 
			
		||||
  if [ -n "${files}" ]; then
 | 
			
		||||
    echo "leftover files:"
 | 
			
		||||
    echo ${files}
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
rm -rf src/ripple
 | 
			
		||||
 | 
			
		||||
echo rename .hpp to .h
 | 
			
		||||
find include src -name '*.hpp' -exec bash -c 'f="{}"; git mv "${f}" "${f%hpp}h"' \;
 | 
			
		||||
 | 
			
		||||
echo move PerfLog.h
 | 
			
		||||
if [ -e include/xrpl/basics/PerfLog.h ]; then
 | 
			
		||||
  git mv include/xrpl/basics/PerfLog.h src/xrpld/perflog
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Make sure all protobuf includes have the correct prefix.
 | 
			
		||||
protobuf_replace='s:^#include\s*["<].*org/xrpl\([^">]\+\)[">]:#include <xrpl/proto/org/xrpl\1>:'
 | 
			
		||||
# Make sure first-party includes use angle brackets and .h extension.
 | 
			
		||||
ripple_replace='s:include\s*["<]ripple/\(.*\)\.h\(pp\)\?[">]:include <ripple/\1.h>:'
 | 
			
		||||
beast_replace='s:include\s*<beast/:include <xrpl/beast/:'
 | 
			
		||||
# Rename impl directories to detail.
 | 
			
		||||
impl_rename='s:\(<xrpl.*\)/impl\(/details\)\?/:\1/detail/:'
 | 
			
		||||
 | 
			
		||||
echo rewrite includes in libxrpl
 | 
			
		||||
find include/xrpl src/libxrpl -type f -exec sed -i \
 | 
			
		||||
  -e "${protobuf_replace}" \
 | 
			
		||||
  -e "${ripple_replace}" \
 | 
			
		||||
  -e "${beast_replace}" \
 | 
			
		||||
  -e 's:^#include <ripple/:#include <xrpl/:' \
 | 
			
		||||
  -e "${impl_rename}" \
 | 
			
		||||
  {} +
 | 
			
		||||
 | 
			
		||||
echo rewrite includes in xrpld
 | 
			
		||||
# # https://www.baeldung.com/linux/join-multiple-lines
 | 
			
		||||
libxrpl_dirs="$(cd include/xrpl; ls -d1 */ | sed 's:/$::')"
 | 
			
		||||
# libxrpl_dirs='a\nb\nc\n'
 | 
			
		||||
readarray -t libxrpl_dirs <<< "${libxrpl_dirs}"
 | 
			
		||||
# libxrpl_dirs=(a b c)
 | 
			
		||||
libxrpl_dirs=$(printf -v txt '%s\\|' "${libxrpl_dirs[@]}"; echo "${txt%\\|}")
 | 
			
		||||
# libxrpl_dirs='a\|b\|c'
 | 
			
		||||
find src/xrpld src/test -type f -exec sed -i \
 | 
			
		||||
  -e "${protobuf_replace}" \
 | 
			
		||||
  -e "${ripple_replace}" \
 | 
			
		||||
  -e "${beast_replace}" \
 | 
			
		||||
  -e "s:^#include <ripple/basics/PerfLog.h>:#include <xrpld/perflog/PerfLog.h>:" \
 | 
			
		||||
  -e "s:^#include <ripple/\(${libxrpl_dirs}\)/:#include <xrpl/\1/:" \
 | 
			
		||||
  -e 's:^#include <ripple/:#include <xrpld/:' \
 | 
			
		||||
  -e "${impl_rename}" \
 | 
			
		||||
  {} +
 | 
			
		||||
 | 
			
		||||
git commit -m 'Rearrange sources' --author 'Pretty Printer <cpp@ripple.com>'
 | 
			
		||||
find include src -type f \( -name '*.cpp' -o -name '*.h' -o -name '*.ipp' \) -exec clang-format-10 -i {} +
 | 
			
		||||
git add --update .
 | 
			
		||||
git commit -m 'Rewrite includes' --author 'Pretty Printer <cpp@ripple.com>'
 | 
			
		||||
./Builds/levelization/levelization.sh
 | 
			
		||||
git add --update .
 | 
			
		||||
git commit -m 'Recompute loops' --author 'Pretty Printer <cpp@ripple.com>'
 | 
			
		||||
@@ -1,10 +0,0 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
 | 
			
		||||
# Execute this script with a running Postgres server on the current host.
 | 
			
		||||
# It should work with the most generic installation of Postgres,
 | 
			
		||||
# and is necessary for rippled to store data in Postgres.
 | 
			
		||||
 | 
			
		||||
# usage: sudo -u postgres ./initdb.sh
 | 
			
		||||
psql -c "CREATE USER rippled"
 | 
			
		||||
psql -c "CREATE DATABASE rippled WITH OWNER = rippled"
 | 
			
		||||
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user