From b8e938037b66881d94955548d648a8a48da2480b Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Fri, 6 Sep 2019 11:58:29 +0200 Subject: [PATCH] Refactoring: - Allows hooking in of bom parsers and documentation updaters - Can read from gradle.properties - Abstracted bom parsing - Refactord buildsystem - Added the buildsystem abstraction --- .../buildsystem/SpringCloudBomConstants.java} | 18 +- .../SpringCloudMavenBomParser.java | 213 +++++ ...loudCustomProjectDocumentationUpdater.java | 160 ++++ .../cloud/release/internal/Releaser.java | 51 +- .../release/internal/ReleaserProperties.java | 251 +++++- .../internal/buildsystem/BomParser.java | 44 + .../buildsystem/CompositeBomParser.java | 53 ++ .../internal/buildsystem/CustomBomParser.java | 88 ++ .../internal/buildsystem/GradleBomParser.java | 105 +++ .../GradleUpdater.java | 22 +- .../internal/buildsystem/MavenBomParser.java | 110 +++ .../{pom => buildsystem}/PomUpdater.java | 87 +- .../ProjectPomUpdater.java | 84 +- .../internal/buildsystem/VersionsFromBom.java | 189 ++++ .../buildsystem/VersionsFromBomBuilder.java | 121 +++ .../CustomProjectDocumentationUpdater.java | 68 ++ .../internal/docs/DocumentationUpdater.java | 14 +- .../docs/ProjectDocumentationUpdater.java | 108 +-- .../docs/ReleaseTrainContentsUpdater.java | 5 +- .../cloud/release/internal/docs/Row.java | 4 +- .../internal/git/ProjectGitHandler.java | 31 +- .../{git => github}/CachingGithub.java | 2 +- .../{git => github}/GithubIssues.java | 6 +- .../{git => github}/GithubMilestones.java | 4 +- .../internal/github/ProjectGitHubHandler.java | 75 ++ .../cloud/release/internal/pom/BomParser.java | 149 --- .../cloud/release/internal/pom/Versions.java | 286 ------ .../PostReleaseActions.java | 28 +- .../{pom => project}/ProcessedProject.java | 2 +- .../release/internal/project/Project.java | 74 ++ ...ilder.java => ProjectCommandExecutor.java} | 394 ++++++-- .../{pom => project}/ProjectVersion.java | 135 +-- .../internal/{pom => project}/Projects.java | 7 +- .../release/internal/sagan/SaganUpdater.java | 2 +- .../internal/{pom => tech}/PomReader.java | 25 +- .../template/BlogTemplateGenerator.java | 6 +- .../internal/template/NotesGenerator.java | 8 +- .../ReleaseNotesTemplateGenerator.java | 11 +- .../internal/template/TemplateGenerator.java | 11 +- .../internal/versions/VersionsFetcher.java | 10 +- .../main/resources/templates/cloud/blog.hbs | 56 +- .../templates/cloud/spring-project.hbs | 195 ++-- .../SpringCloudMavenBomParserAccessor.java | 17 +- ...stomProjectDocumentationUpdaterTests.java} | 114 ++- .../internal/PomUpdateAcceptanceTests.java | 43 +- .../cloud/release/internal/ReleaserTests.java | 32 +- .../buildsystem/GradleBomParserTests.java | 123 +++ .../LoggerToMavenLogTests.java | 2 +- .../buildsystem/MavenBomParserAccessor.java | 31 + .../MavenBomParserTests.java} | 73 +- .../{pom => buildsystem}/PomReaderTests.java | 17 +- .../{pom => buildsystem}/PomUpdaterTests.java | 127 +-- .../ProjectPomUpdaterTests.java | 14 +- .../ProjectVersionTests.java | 11 +- .../{pom => buildsystem}/ProjectsTests.java | 4 +- .../PropertyStorerTests.java | 4 +- .../PropertyVersionChangerTests.java | 10 +- .../{pom => buildsystem}/TestUtils.java | 2 +- .../VersionChangeAssertions.java | 2 +- .../buildsystem/VersionsFromBomTests.java | 301 +++++++ .../ReleaseTrainContentsGeneratorTests.java | 4 +- .../ReleaseTrainContentsUpdaterTests.java | 14 +- .../cloud/release/internal/docs/RowTests.java | 4 +- .../release/internal/git/GitRepoTests.java | 2 +- .../internal/git/ProjectGitHandlerTests.java | 2 +- .../{git => github}/CachingGithubTests.java | 2 +- .../{git => github}/GithubIssuesTests.java | 6 +- .../GithubMilestonesTests.java | 4 +- .../internal/gradle/GradleUpdaterTests.java | 5 +- .../release/internal/pom/VersionsTests.java | 265 ------ .../PostReleaseActionsTests.java | 49 +- ....java => ProjectCommandExecutorTests.java} | 194 ++-- .../internal/sagan/SaganUpdaterTest.java | 2 +- .../template/TemplateGeneratorTests.java | 28 +- ....java => VersionsFromBomFetcherTests.java} | 40 +- .../demo/BootstrapClientApplicationTests.java | 3 +- ...strapDecryptionClientApplicationTests.java | 5 +- .../StandaloneClientApplicationTests.java | 1 + .../git/COMMIT_EDITMSG | 1 + .../git/hooks/commit-msg.sample | 6 +- .../git/hooks/pre-commit.sample | 24 +- .../git/hooks/pre-push.sample | 42 +- .../git/hooks/pre-rebase.sample | 58 +- .../git/hooks/pre-receive.sample | 29 +- .../git/hooks/update.sample | 129 ++- .../spring-cloud-core-tests/git/index | Bin 33271 -> 33343 bytes .../spring-cloud-core-tests/git/logs/HEAD | 1 + .../git/logs/refs/heads/master | 1 + .../01/07e3e2d5db844ce7b88f3e4705d39d8acaf68f | Bin 0 -> 46 bytes .../01/10457896955bfea6e6a05c9cf880b759d7320f | 4 + .../01/425bc517960a423c57d8955fdb3b365460a881 | Bin 0 -> 680 bytes .../02/11cd33108da7f28c70d91542cc123a4665c47c | Bin 0 -> 46 bytes .../02/c8a9e576df3407af8288af8fbf5531c44dd4c9 | Bin 0 -> 67 bytes .../02/f03fd5487cce4ce37f01933993fca0804d5803 | Bin 0 -> 79 bytes .../03/523674a49e04a991b08cc3cef52f19fa3d2bfb | Bin 0 -> 47 bytes .../03/54ec3cd6cca1aabd257bd27ea2f3d368e6d2c2 | Bin 0 -> 68 bytes .../03/645e8cee9e5ed0e1bc731e76e048d31687638f | 4 + .../03/87119a4515874cc25efff683b28be0a1ba2632 | Bin 0 -> 66 bytes .../03/8991c238227ad7df0d1633c8f13802b4ecbf91 | Bin 0 -> 72 bytes .../03/b4edb024bc4204b4415e070a53968dacf26b8d | Bin 0 -> 1030 bytes .../04/a9af3e66ecd4622155a05bfb20f14b86419ee4 | Bin 0 -> 931 bytes .../06/edce730e9443caeb7326e89d41cc1992f3e9c4 | Bin 0 -> 75 bytes .../08/3658b0e220a59e30123517e74d212c2868da5f | Bin 0 -> 572 bytes .../08/630aed6042402bc1a7913af70738cb0295e683 | Bin 0 -> 46 bytes .../08/fec0fc585e7676e856ba2a9d6ee0ddef54840b | Bin 0 -> 964 bytes .../09/4f552a4ae55d345c5da650877f66aebbacc180 | Bin 0 -> 79 bytes .../0a/8f9cfaa28acfe568882c787b4016e9fd0bb186 | Bin 0 -> 156 bytes .../0a/917582960ab2784526c132c3b660d3eb0d1c5e | 4 + .../0b/ab2242b6fda577c3131bc19b14c3cfde29c3fc | Bin 0 -> 66 bytes .../0c/21588e05ccdf40ee8eeeaa1757d07bb6494bb3 | Bin 0 -> 74 bytes .../0c/2f08558d3ce04a6b06b656e2485507996f6c4e | Bin 0 -> 954 bytes .../0c/fb51cc4451bb3d68e8ede17f7e4d071582aca0 | Bin 0 -> 79 bytes .../0f/33f64ea1c39c97b004ef6a033ac195960a385d | Bin 0 -> 46 bytes .../11/10956700d3976fd1939251ef76dbe2434701f7 | Bin 0 -> 70 bytes .../11/48d21548560fbc1207d86bbaaad2db6022d7e4 | Bin 0 -> 88 bytes .../11/9040e75e3792701d28f1eae6a70783aba13879 | Bin 0 -> 81 bytes .../11/9d12c26cb60ad71c7e21c8ac5da8de2aca2568 | 4 + .../11/cb65c3f7fb479d7d3d851b69749489ecb9f57d | Bin 0 -> 82 bytes .../11/da4b03a553337d470c099ed7a5066937fecdb0 | Bin 0 -> 62 bytes .../11/e3fd26e437b71e04e367b2996b53085859d718 | 1 + .../12/79683cf7367516cf4a58a114e39c5d9357a579 | Bin 0 -> 77 bytes .../12/974ecb781efc46c1a17b45bb617c74efa18a16 | Bin 0 -> 66 bytes .../12/9fbcc86f9a8f545edf3a98d71fa2a4b9f5b76b | Bin 0 -> 78 bytes .../12/a1f01d28f5fab915642a87b89838666f39701a | Bin 0 -> 1189 bytes .../12/f05030cdedb3ef85a9873886c63161d120fdc2 | Bin 0 -> 1001 bytes .../14/0c6cbaa8929a5b3c29928741ad04caa9efad73 | Bin 0 -> 1641 bytes .../14/20c135339b445809162b38a692ef99941f1d95 | Bin 0 -> 46 bytes .../14/3d12d86aa3a2b7f831a0430ce4de8b28d82a51 | 3 + .../14/92f391ea966f970e44d551a68f8381ed4ea316 | Bin 0 -> 46 bytes .../14/ce2ad4026861d89bee5f3555abbd1026726394 | Bin 0 -> 47 bytes .../15/7e0f2dba5866e09dc01971fa0f13253d55d31e | Bin 0 -> 76 bytes .../16/aaaf324eb9c03214ec832bc7549aecb5610541 | 1 + .../17/91825177d20268cd76aca7bed46160427c479d | Bin 0 -> 46 bytes .../17/fc0524a437e4808cf95cf4bcedf8c0c6498a4d | Bin 0 -> 79 bytes .../19/652936f550e48b4365dbe70c6fb5e5b4900a82 | Bin 0 -> 702 bytes .../19/79e81927c315b3b0f639267b2b944b9ef7ffc3 | Bin 0 -> 815 bytes .../19/b82895470b80fe836fdf4b24796f7b8daf6b61 | Bin 0 -> 74 bytes .../19/c8b00f48088aff03daaeab108c0ae1f3618d98 | Bin 0 -> 46 bytes .../1b/20a03ec26b82231e95d09e4da5e275320701dd | Bin 0 -> 651 bytes .../1b/8c8fa0ac1d68b2e286e21073445696555456a8 | Bin 0 -> 102 bytes .../1c/83c189b8881a4a0173b73d374c0cd74765269a | 1 + .../1c/f8cc93f14e4ec7b3e6d2566653c1073f0a915f | Bin 0 -> 77 bytes .../1e/120f6fdc27b578aafd3db30500b1a0bea0d9e5 | Bin 0 -> 1173 bytes .../1e/2fae7bc4a81cc3b0c2bf94ea6b7a1497083645 | Bin 0 -> 79 bytes .../20/005fb4c9b9ca7c85ff2aebf611942a041fef6b | Bin 0 -> 46 bytes .../20/b325dcc7a5a9eb5610fc1587bfcac9313ff1c1 | Bin 0 -> 1158 bytes .../22/ee771cad7c4b0f17d9b038c3d7aa6a9aebc15e | Bin 0 -> 929 bytes .../22/f856ada5bace418b04683f231c364cc113ed41 | Bin 0 -> 46 bytes .../23/d1b12d777b8aff1473b5aee2f5897a9b5b8184 | Bin 0 -> 117 bytes .../24/56ddbc58516524f228483a85b0cc2e7088af8b | Bin 0 -> 921 bytes .../24/60f1beed2a074726a8a0e946387f8ca0c662c8 | Bin 0 -> 80 bytes .../24/cd2a2c1086906a2e399bbec584e1c93df1f4f9 | Bin 0 -> 66 bytes .../24/d788c5943f09a1bbd8af6010636cb6f8b422f9 | Bin 0 -> 929 bytes .../25/1bf5f968833778852f4975ed010b2ce64c2cc7 | Bin 0 -> 1025 bytes .../25/223594edc1481bdbfca32225a7f1c3a66ddeb9 | Bin 0 -> 72 bytes .../25/7953d389fc8451520f2f71552fb4476277291b | Bin 0 -> 82 bytes .../25/97222b8c3d4b2c49c7fc3e5288da62574320c9 | Bin 0 -> 46 bytes .../26/010ebd861c7280a21e27fcf77164624d5bd15d | Bin 0 -> 823 bytes .../26/914b5d4da8bc81fe4d5dc108190d959994824c | 5 + .../27/05064df8cd6bb37bd69acc6e7033fc2bd5d80e | 1 + .../27/f3a58a7573fb5326d07fd419a444101b92b864 | Bin 0 -> 74 bytes .../28/4b968b18fec7863ce2f240144f82ba947041bb | Bin 0 -> 81 bytes .../28/96b7f081b5147763ebbf2a0fdba61dc8636317 | Bin 0 -> 105 bytes .../29/b76ab14c1aa22b2a4dea14ad58c91e20d8f817 | Bin 0 -> 79 bytes .../2a/888c165936552d97605b747cb853bcd0a7dc31 | Bin 0 -> 74 bytes .../2a/89d4de6653c81c21ab213f9c97da05c24cda80 | Bin 0 -> 46 bytes .../2a/af0a96ead26ce1615fb768875d9941b149f2fa | Bin 0 -> 96 bytes .../2b/17d9d304d10eaf8ab29f0cd9c4b6ad7a47594a | Bin 0 -> 46 bytes .../2b/2235bce7e286b5aada0dbb6bb23da5f8cb3375 | Bin 0 -> 809 bytes .../2b/301a415819e421e0679ca2448bd476ac801656 | 1 + .../2b/304681b9f0dd1c4a1a6f100639497767691b93 | Bin 0 -> 79 bytes .../2b/39bd0c6257a17a78afd9b35f84fd44298c227e | Bin 0 -> 108 bytes .../2c/0189ee09ae9cdf4db26cec9e3dfa27d9cb5e22 | Bin 0 -> 1184 bytes .../2c/cb490a582bc294ce60613169ee833a7b575701 | Bin 0 -> 81 bytes .../2d/6ee32362243ef322a02ec364fde6fc657c091e | Bin 0 -> 71 bytes .../2d/d01cf45e56702606e2e4be654cebe6c34a5d1a | Bin 0 -> 46 bytes .../2f/0ebb437dabdc79b070a4bd8033da25626eb558 | Bin 0 -> 47 bytes .../30/b21da69c596b83ef6c6b228b1176550a40eb87 | Bin 0 -> 563 bytes .../30/ddc0d503df93b983f7a8ffd8d28f80290d9fe0 | Bin 0 -> 46 bytes .../31/1a460e853e1bd9795d6fcae056a8f71d2d605a | Bin 0 -> 124 bytes .../31/3077eb3d52dd4a2bec0d6cb9c12a1b15e11a1c | Bin 0 -> 46 bytes .../31/6f5d1755c84958b17e6623dce8a3fbf677627a | Bin 0 -> 995 bytes .../31/b09ff4de675cf3036d5299868289ce5629f4eb | Bin 0 -> 752 bytes .../31/ed9383295f651dd92f504b787ec0753a23740e | Bin 0 -> 74 bytes .../31/fdaed8b7dbaabbe01424c9a06fc74cb0a7c4f9 | Bin 0 -> 46 bytes .../32/b0b24b34d2ef8ac7c63c07d687d48efbd370aa | Bin 0 -> 74 bytes .../33/764af82504ed9f0099d4d34aaa0a62032e1f94 | Bin 0 -> 79 bytes .../33/f1976f98d889dec82ca56d2fb24c7c3bcffc17 | Bin 0 -> 47 bytes .../34/ebc770b3976d4d69183b99d69e3c6611130b89 | Bin 0 -> 918 bytes .../35/2a2d85940cf5bf182b377eb64661115387f987 | Bin 0 -> 72 bytes .../35/433764d56cef44b56cf0c161abed6eea40cad9 | Bin 0 -> 46 bytes .../35/625e0d2f5d6ed98c236d3fe5eb74118411ded1 | Bin 0 -> 682 bytes .../35/8dbed1f9e69a7d91797f13e20510c615db3bb6 | Bin 0 -> 118 bytes .../37/cb16dbfa3e7423a69a17ec517edd97fcb7ef02 | Bin 0 -> 116 bytes .../37/f118c7184e629851b89216772a45cac4d1147c | Bin 0 -> 79 bytes .../38/0c542cf4bded22d0edbefd27107fe372e0e62e | Bin 0 -> 70 bytes .../38/3d81c39f4da8ee934b03dba7e753ed051af409 | Bin 0 -> 46 bytes .../38/6b51f433ce2543bccb96adff49a6db306b2355 | Bin 0 -> 123 bytes .../38/f222cec182df9dc13b627fe2ea51e707c00905 | Bin 0 -> 73 bytes .../39/070812bee6a0498396ee1441278f5678caf170 | Bin 0 -> 74 bytes .../39/f2f11ed1f77f0259967e53ecbd946d5b422536 | Bin 0 -> 1019 bytes .../3b/0be4147d56f425a14d04a992365d061ef4b992 | Bin 0 -> 115 bytes .../3b/87ac49b17c51472014e581c7e26a6b6a76096f | Bin 0 -> 564 bytes .../3b/9a2763e46ac047c65e71daecddcf8f12427c2d | 2 + .../3b/afc466462a9f0a5c15c9933a065f7c6b6dd0a4 | Bin 0 -> 725 bytes .../3c/0844a83a874210e64f833767e922d1f3f4be4d | Bin 0 -> 70 bytes .../3c/3e546f40587167ace1fc720e1b68292bc7c867 | Bin 0 -> 178 bytes .../3c/d2b3a67331365eb7aef83e9f39a94625becb6a | Bin 0 -> 47 bytes .../3d/6638244ea054bd71ad5d715c2e86b17684f448 | 5 + .../3d/7257e7634312e2433d345ed71b33627a28e19b | Bin 0 -> 1018 bytes .../3f/02bbda85368e9d2578d76bd1b7d2dd98f70c0d | Bin 0 -> 68 bytes .../3f/ab0ebb702a6a6c9836111a102a17c2134b40a9 | Bin 0 -> 67 bytes .../40/7bd6ca2865aa7ad2da29372083278debf1b797 | Bin 0 -> 90 bytes .../41/112c92c1058ed0c7c09e21215bf7ee58d09e1d | Bin 0 -> 619 bytes .../41/5e77f8b87b7410fb2e332f5b6cebb47b7ab3b5 | Bin 0 -> 719 bytes .../41/f788ad3541b9bba23c35080010defe869a4d43 | Bin 0 -> 46 bytes .../43/c1869b1f85225c2bc348f5484d45341e871f92 | Bin 0 -> 153 bytes .../44/a0c3b71edc9b6cd61dda0a9b7fe75c9486177d | Bin 0 -> 46 bytes .../44/a77e7992f88f44843f0626c8d1593d451ed53e | Bin 0 -> 73 bytes .../45/4c347a24481106a559a52744cfa7d41c602939 | Bin 0 -> 47 bytes .../45/8049c271ed9f3849d8f3b662728c3300af6b9b | Bin 0 -> 1009 bytes .../45/83d38d6007f03325f3116ff8d3d551432b615f | Bin 0 -> 69 bytes .../45/ad05561a45304f9a6d6b7e6be47ee5fcfa2636 | 2 + .../45/f56be8663e79defd784fde046040df3cc7c503 | Bin 0 -> 79 bytes .../47/52d372a47df547b2e6977d17985a0a2da172d1 | 1 + .../47/685c671d98b9f246084b5573d2e20667bbde04 | Bin 0 -> 82 bytes .../47/75c95c39f71376410fbf299721056058a7028a | Bin 0 -> 115 bytes .../47/b42db8e73abec42f87af427aa7fbf414dcfbfd | Bin 0 -> 153 bytes .../48/5bc91281552b177823505477795d82fd13a3d1 | Bin 0 -> 782 bytes .../48/f47535c1303d038153ae84851abcca60626239 | Bin 0 -> 821 bytes .../49/2833a3ff9bf5a82996ecbd9a8f231eb76f692d | Bin 0 -> 46 bytes .../49/e41b0e2c61267e191ecae58fce84591da7d419 | Bin 0 -> 930 bytes .../4b/3b141115ff56d4d83493f7e8bb89fe9250f274 | Bin 0 -> 82 bytes .../4b/cd2c7e3e5342522c6f8b7746870d8685d092ea | Bin 0 -> 81 bytes .../4d/1c87e362ab882f012dd4048eaaa9624562083b | Bin 0 -> 67 bytes .../4e/7364be9bad7ffcc3ce046f75c0f8b3d81c18e0 | Bin 0 -> 79 bytes .../4f/5e54d0dbfdada2dfb67d8e868bb48e5329e124 | Bin 0 -> 109 bytes .../4f/9b11051a1e02327e15ca4cd0244e779fabbc7f | Bin 0 -> 46 bytes .../4f/f429466a2a10f5377438526c8511ce0407df1c | Bin 0 -> 75 bytes .../50/37bc102aa7f65329b5d3cf9c1e5894cc3337db | Bin 0 -> 729 bytes .../50/745cc5616a1c134dbb8762464d16f0d8ae1ea9 | Bin 0 -> 78 bytes .../50/b9352be60f180b3e9e6cedc670b942a69942cd | Bin 0 -> 74 bytes .../50/bf3c1d6afc8056227f42a56246ca63aaf9af5a | Bin 0 -> 66 bytes .../51/401846a6cf2780a52bd50afc3d1ead315ec351 | Bin 0 -> 74 bytes .../51/715f9f89d8cdf74328d8c25694b170bcbe99b6 | Bin 0 -> 102 bytes .../52/450669e7653a800d766e9eb350a07df4f661af | Bin 0 -> 34 bytes .../52/7842f72663aaf32bc9bbe8c4709d25d217e73d | Bin 0 -> 822 bytes .../52/b0c65e622564413d50f64906b9cfbd5551ae6f | Bin 0 -> 568 bytes .../53/80912fbb66f5bfd7e53fee55a0637daa1ec995 | 3 + .../55/72d7476881992748fa29d7963f98aa0162ae5a | Bin 0 -> 47 bytes .../56/7f2b355a468df1d93378a83b574afcce6d0c6e | Bin 0 -> 46 bytes .../56/ab1b49248acb400882e03f26ce497fe6ecdd1e | Bin 0 -> 75 bytes .../57/3df7e0031efd9e07d22fa7b9d7b5c623dcb476 | Bin 0 -> 82 bytes .../58/412ad107c42aef9def9fa5efebdea718c20ff8 | Bin 0 -> 75 bytes .../58/968f9b2a21276b497c299eff74d9b42cec071e | Bin 0 -> 81 bytes .../58/974f0d95a0aac4d970f8d1419a8cd51a19b54e | Bin 0 -> 79 bytes .../59/27da3bd9c4a3d0473368120959099cf6ad6921 | Bin 0 -> 80 bytes .../59/9ee8c973ca27b36118a7abfd49753bfa20748a | Bin 0 -> 900 bytes .../59/b21cbd452a5b2f0666a7d5a6cafb0195acb53f | 7 + .../5a/3ebafc7eaa5e8c40ca7368a4380b876b7223ca | Bin 0 -> 115 bytes .../5c/78fcfbaa883608f92f9b6f6d81d0405713c8a3 | Bin 0 -> 1015 bytes .../5c/d0b320cf839585c1bf289b86ada552db0239b3 | Bin 0 -> 46 bytes .../5d/0bc4781d05d90f3cbea3a0b21e8470a0f9aafa | Bin 0 -> 74 bytes .../5e/f7b1694925c635bf8bf7f8e2ff5605c4541a14 | Bin 0 -> 116 bytes .../5f/bdd0e0606a0abea222a56af0d4b72f22445a07 | Bin 0 -> 46 bytes .../5f/bde9259f129e7dc734d0d18ea65d61e4c7e3f6 | 2 + .../5f/c020dfaf2838ef1920f646f7bd3881b67dcd74 | Bin 0 -> 75 bytes .../60/c776b859ce72f528fc97788f0e74648d638e4d | Bin 0 -> 46 bytes .../62/3df4da4a46cc6aba1b12baf403a9d6aef8b9a4 | Bin 0 -> 36 bytes .../62/4705db59c80e6b9e92556a1131c9b8412ea290 | Bin 0 -> 74 bytes .../62/7ff09e191ebbfdb60a2b0d07448285d4ffbf4e | Bin 0 -> 77 bytes .../62/dba8d7454e83c79601994ce30f3a796664bad4 | Bin 0 -> 1052 bytes .../62/e27f2ef3f1f71f6662d2dc71c38cca37d2a455 | Bin 0 -> 80 bytes .../63/123e5ba7d9b6d7113c7f3a5260f833a40e9043 | Bin 0 -> 171 bytes .../63/c4fc59088e2b8b61068c8504bee44588c1ed33 | Bin 0 -> 46 bytes .../65/2d5fdab1df59a05f18411e19fb48ec15d1d20d | Bin 0 -> 76 bytes .../66/3871ead7de37140d3b877d68fa1f502fdaa22b | Bin 0 -> 46 bytes .../68/4756480e018f36d7c54129e1c5bf553791401a | Bin 0 -> 47 bytes .../69/640d209c58e7f4a21392d77e56589213443701 | 4 + .../69/d881a24ac2e81f709c7975b60d67bedc2910e9 | Bin 0 -> 75 bytes .../6a/1c8198a8111eae725a96569a973f8c7b163a44 | Bin 0 -> 46 bytes .../6a/522240457a2964e091e0c6072596b2dd54574b | Bin 0 -> 82 bytes .../6a/5849d491f72d0d0e19c59b82910d2818cbf319 | Bin 0 -> 80 bytes .../6a/ac795533ced5075a9dc23e26dd8bfdc3303dff | Bin 0 -> 645 bytes .../6a/e15afc58e37c0f50eb715d6f17c64caba45bb9 | Bin 0 -> 80 bytes .../6b/b5efa01252588d84c5247351cbaad227cb688b | Bin 0 -> 79 bytes .../6b/f656aadc9fa29cb5f103d769ef7278be42cc09 | Bin 0 -> 81 bytes .../6c/db973f7dad5ef98087b0ae81661d5ac7e87dd1 | Bin 0 -> 1003 bytes .../6d/7a0de1943be4ac21fd4807b12617d9f7cf8ca7 | Bin 0 -> 79 bytes .../6d/c5c50f5bdbe30104dd0a28c575bd508822bb66 | Bin 0 -> 779 bytes .../6e/452327e0328b29415cb2020b3db6ef5346b966 | Bin 0 -> 75 bytes .../6e/7433a4d834cde4968e648e239074ac2ab01eba | Bin 0 -> 79 bytes .../6e/f3d5fd3e7a1e337ccbb0ec425c39f0ddda6e58 | Bin 0 -> 77 bytes .../6f/9bcef519991efbd2a1edf823b6b1e4ea7c6a36 | Bin 0 -> 46 bytes .../6f/a85d850e92c192a604df0183f79d5e641f6a68 | Bin 0 -> 46 bytes .../70/8824c87cc9701e1dc8afc46dd90d9d6371265a | Bin 0 -> 46 bytes .../70/da6cfc16be6726c80e97d5e766bd4370e90f3a | Bin 0 -> 74 bytes .../70/ebdd9cdcddd4bc26e444ee144095f98b9fb2cd | Bin 0 -> 79 bytes .../71/cfaed6e068995e8cb84ac16391c3ef67241dc2 | Bin 0 -> 124 bytes .../73/58c382cc26de8c5fd2e60b1c771d7da5121d56 | Bin 0 -> 607 bytes .../73/ee715eacc3af6cb4913d2c49b1aa8a872e306a | Bin 0 -> 72 bytes .../74/f4cdbe80d8aa9d9185c2e64edcd76a418b9611 | Bin 0 -> 77 bytes .../75/040ca5a5a69bffb3fcc4ad55dc122102681d4f | Bin 0 -> 73 bytes .../78/5f31d562e1e8be2a9501438e248589256cfd53 | Bin 0 -> 1140 bytes .../79/5ddee6045c6c6b66998a61890480bb0f84e6b4 | Bin 0 -> 1015 bytes .../7a/dedd63e8661b09063362a42c65e98931d290cd | Bin 0 -> 81 bytes .../7c/75b6c86e3454e70c51abcb1152cfb9bba71d16 | Bin 0 -> 119 bytes .../7d/2fd94b48fd9907168c90d5bd9400a5b6ebc5ad | Bin 0 -> 46 bytes .../7d/b28ad5103383fc58f064337914f5d9198ee53b | Bin 0 -> 1002 bytes .../7d/b90d5b8d1476acb720df185a9292ab331e3671 | 3 + .../7e/e7d5b098e9a83450c74593b3cdf9a214a631c7 | Bin 0 -> 74 bytes .../7f/810bf6c1bae0094da57ce27cee853c2a0b4c74 | Bin 0 -> 67 bytes .../80/74285cbd728cc9acab61849e56d1d8ae6cdfa9 | Bin 0 -> 877 bytes .../80/88eec3ed1a40ca8b4aebc988df41c9f5983e89 | Bin 0 -> 574 bytes .../82/16f75d45089de99f435b1084d583c6046fef4a | Bin 0 -> 717 bytes .../82/bc5729b96b650c316a83a886e6ce1f7133c520 | Bin 0 -> 46 bytes .../83/724e8d9baace89a740c038883d7c3ea02df860 | Bin 0 -> 46 bytes .../84/cc3f4746967802e002afaa29239e5f5cf9a8b8 | Bin 0 -> 1004 bytes .../84/de6cca8989402dc7727e57708990476e167fe6 | Bin 0 -> 46 bytes .../85/23b544eab61145ee4ca5c4ffdf1a9a2579273b | Bin 0 -> 85 bytes .../86/46903988a0d24ec525f59e7ca51643e3bd46ca | Bin 0 -> 78 bytes .../86/9ff1cb27c20295c7d747ddc4a42f54db6ce1f8 | Bin 0 -> 46 bytes .../86/a35cc5698f9f5f5e26790b8428baaf16f11bbe | Bin 0 -> 75 bytes .../86/d61a366ccb18762a1342a6b9df7313bcfc1bda | Bin 0 -> 67 bytes .../87/227e660aae5156fc51f489d33b450e23611170 | Bin 0 -> 76 bytes .../87/86f1d1ef84031fb18cb563aaa1c229c8ac1d76 | Bin 0 -> 84 bytes .../87/e06c77e7a4741f55f81c2b8acfe76cf43c97cc | Bin 0 -> 46 bytes .../88/341e604196fa20a93a3cf839625f6818cef430 | Bin 0 -> 790 bytes .../89/0196e16ebf8117619704a45007328746a7c731 | Bin 0 -> 46 bytes .../89/52c7993f64ef7fa6d04abfef45d4dec447ba9d | Bin 0 -> 79 bytes .../89/88c9719cd8499876c0bb9340d1cc39f10ed9c6 | Bin 0 -> 292 bytes .../89/f8b6b3f22f94a11cd5398dd62b1d5931eb78ce | Bin 0 -> 79 bytes .../8a/8fa9237e8d4d3c7a591169414811836e3ac5cd | Bin 0 -> 1012 bytes .../8a/f9597e67ea223068ac8cc4ed02968550a52e47 | Bin 0 -> 74 bytes .../8b/7bac5cee91811657b1fbf1038054ccbe6cda12 | Bin 0 -> 46 bytes .../8c/58d1f69a0e67824089fd0a982c3fc351839253 | Bin 0 -> 83 bytes .../8c/b1d686e94588d64d9ba56f3d853922d669a7c9 | Bin 0 -> 46 bytes .../8e/180a276e8e4bfa288c44651e801877743c529d | Bin 0 -> 567 bytes .../8f/8826477c2ac54efa42a24e4f1d4e53eb3baa57 | Bin 0 -> 74 bytes .../8f/b818a646b250477e4e3eac1ea66e55b8106538 | Bin 0 -> 46 bytes .../91/c9f4528c41270c010decd837f99d85dbb4ba8e | 1 + .../92/e89353a12573455789b028b079b54c03dd4c87 | Bin 0 -> 80 bytes .../93/9c3ac54e2dd75545379c4875f036644e03e768 | Bin 0 -> 948 bytes .../93/9dc265a8bc24f1b4ac881f10aaac2016d298dc | Bin 0 -> 939 bytes .../95/4057eb220ff7b5a035660720ea28a2f1638c34 | Bin 0 -> 73 bytes .../95/59ebc4eb06fbd8ad2c82291e7c4de1ebc34312 | Bin 0 -> 595 bytes .../95/d4e2f868179a88d6a7aafcd775b1b73e15a60f | Bin 0 -> 79 bytes .../97/bc012fe27c3410a0b4ce57a3280f0be81c93a3 | Bin 0 -> 85 bytes .../98/2a6cc3e7fbb1ae718011a8be2d1ff668fc4c79 | Bin 0 -> 75 bytes .../99/2e446e141badfad4bf2efafa8607892167e7b8 | Bin 0 -> 46 bytes .../9a/74a89e21c624c32c2393171a4ed38362f43dc9 | Bin 0 -> 46 bytes .../9a/74fac61b5d52bd176b7cc6848169e5df41b7bd | Bin 0 -> 46 bytes .../9a/75fa9181e0b24eee88da728dd753cdb392bd9a | Bin 0 -> 71 bytes .../9a/f54972e023a5ad469c7c90c6353d338fbaa2de | Bin 0 -> 74 bytes .../9c/4bd7daeee9acb66233c35ccc00016f528b0345 | Bin 0 -> 958 bytes .../9c/65acf855617b2985ad2a3770f13689e285fcc8 | Bin 0 -> 74 bytes .../9c/892482b651153eaedc763217fcf6952faf3727 | Bin 0 -> 563 bytes .../9c/f7027887cb2651965e9fbcd611371ee355f0b2 | Bin 0 -> 46 bytes .../9d/29487d49ee0db941d8a13e02c427021defbfd4 | Bin 0 -> 46 bytes .../9d/901fbb29aca332080be170cf704cd63d8cbf8d | Bin 0 -> 46 bytes .../9e/938321fecc3e159c33557f1d72ace32d97e90b | Bin 0 -> 75 bytes .../9e/abe4ec02f5b35e1f3418c9ae7a3c8dc2f98c21 | Bin 0 -> 978 bytes .../9f/0dc8976fcd237a63a447b9c060f6c268ab09c7 | 3 + .../9f/77ed0204270fbc27809d1520f2f7563123320c | Bin 0 -> 46 bytes .../a1/4a3a950df4cd8bddc5baa9bfa28964565f503c | Bin 0 -> 46 bytes .../a4/17e8a6626fdddc294945cfa60c3dd10810c7f1 | Bin 0 -> 968 bytes .../a4/8e0be77a34f8625337aa00af0a3597138e1c22 | Bin 0 -> 75 bytes .../a4/aa923834bff292a4de0b138ee68b0aad124e56 | Bin 0 -> 1016 bytes .../a4/c7916e61bbaba1d06e9615aa80e656bb01a764 | Bin 0 -> 75 bytes .../a4/e268da08e5d1a5b450489ef85c1af6026b7a57 | Bin 0 -> 74 bytes .../a4/ea7a9b018dc5d0c3fe233264c2c788fbaf483d | Bin 0 -> 81 bytes .../a5/46dbd036af810ee849d69746ef4b00ad014bea | Bin 0 -> 81 bytes .../a6/478a790da7368fd603b7021406314cbf30e3ad | Bin 0 -> 46 bytes .../a7/5ba41fed2e989551ec02a953a45cf7a18af7c8 | Bin 0 -> 81 bytes .../a7/b2fa680fa3929421169417a573e77dc52bc465 | Bin 0 -> 74 bytes .../a8/a89b6bbde6136319f3f1d625a8f9e6f6e9aacc | Bin 0 -> 46 bytes .../a9/72fc48d296c3646c2b85ade1b826b6a5156cd2 | Bin 0 -> 80 bytes .../a9/8ae2cddee35fd2107281c1d9afef4582f2f2fd | Bin 0 -> 79 bytes .../a9/b9a9a314668d4d3fb692f8dfc4ee560251fb15 | Bin 0 -> 709 bytes .../a9/c4996d99434452c25dc51f033128a39fbfbc45 | Bin 0 -> 841 bytes .../a9/fc24996247f4bc2db2984c03197c358fb210a4 | Bin 0 -> 71 bytes .../ab/69c38dfca3dbd22ce8ef76056f723a9f039ea8 | Bin 0 -> 46 bytes .../ac/dce9405147ec335281985c08936a2ff907c793 | Bin 0 -> 1063 bytes .../ad/7466ae1885b313d73901fad5617cc5b141377b | Bin 0 -> 71 bytes .../ad/d1fc2ced5f64c92c7cb21b482d87353ec30879 | Bin 0 -> 46 bytes .../ae/ef09d318e80a96a54332a3eccfa72d6cc56689 | 1 + .../af/24209a10dbad154187b74a351d288005a9e78d | Bin 0 -> 81 bytes .../af/52b5bd0ad18f90cae92306181d51a189c0afe4 | Bin 0 -> 666 bytes .../af/e7ade93a7a1004067d7c094922ab0bd66a42cb | Bin 0 -> 59 bytes .../b0/315c87b1cc581a12a54b07b96dc8925fcd5fc0 | Bin 0 -> 46 bytes .../b0/f24ef1127df040200772fb30ce48fe44abb68e | Bin 0 -> 47 bytes .../b1/88afc70c6bef38582788459a99a7986182d1dc | Bin 0 -> 46 bytes .../b3/e2f86fa9f2c505b578d55ec9ebd144976c0821 | Bin 0 -> 72 bytes .../b4/4c7852d1b04ff2fd1b63091ef51631ac272811 | Bin 0 -> 82 bytes .../b4/7eb57c3f30fbbf44814063013ae2223d008409 | Bin 0 -> 706 bytes .../b4/cc9ec916cd76a6a5826fe71b08e826042ed594 | Bin 0 -> 973 bytes .../b6/02fa301fdd5688861011e9b8ffb05446c62468 | Bin 0 -> 47 bytes .../b7/a716a20653e1c5ac77228a6395b58d108b41f9 | 2 + .../b7/ca9026300d3fdd9af2595367b0afb3dc9165d2 | Bin 0 -> 46 bytes .../b8/21b31c565e861f53a2b34d01fe23d902be2f6a | 2 + .../b8/343fab0cd2dba07c7b3cbbb02469e04dcbd3c9 | Bin 0 -> 81 bytes .../b8/b474a46196311025c6a8e7c9f53bb747befc73 | Bin 0 -> 62 bytes .../b8/cba47468ff99d781fc85c8ff0686611720d87c | Bin 0 -> 84 bytes .../b9/4b21df294675f5a6e0da7a5c0a2e23183466d3 | Bin 0 -> 46 bytes .../b9/69510eb1c782107181a09b4ebfcff5e120ac1d | Bin 0 -> 74 bytes .../b9/ec320a66eca056fd340056619de894e9a4d7b7 | Bin 0 -> 46 bytes .../bb/eb269763559f8a138b18dc7a31e16092177b96 | Bin 0 -> 82 bytes .../bc/27392f0e73ce9aa93dcf154151cfc78b77cd1d | Bin 0 -> 82 bytes .../bc/29315f3b2e1ecac8c972352cb9aa4d582f8b06 | Bin 0 -> 46 bytes .../bc/6dccdc582c505732b22f1e67625b39561f491b | Bin 0 -> 116 bytes .../bd/29978a7edcd2f02644fa90165beed8a01cca81 | Bin 0 -> 814 bytes .../bd/6d7601e41d763328a6fb90fd11405dd87ebc53 | Bin 0 -> 805 bytes .../bd/9b9c7805089d87771580fba42e0a760dced62d | Bin 0 -> 81 bytes .../be/34b6152b679da2e544f3117341d69a8f45b4d7 | Bin 0 -> 47 bytes .../bf/afdf41c1fb4f2b487f620204c84a9ccca00ed1 | Bin 0 -> 1007 bytes .../bf/dda449a5c0245fdd90e8901bb238013a67bc3b | Bin 0 -> 115 bytes .../c0/484bb5262778ec6bc2be62e742236d565b8427 | Bin 0 -> 124 bytes .../c1/362812db9d81bf0ea9d5044e8984957a526f9e | Bin 0 -> 641 bytes .../c1/849267ee0c808e8777aaae5894575d1afc8b19 | Bin 0 -> 1034 bytes .../c1/e0bfadd1ddef749d91f9eed680bfe477506569 | Bin 0 -> 46 bytes .../c2/7fd002fb181487186842a6fe9a888c8a3302f5 | Bin 0 -> 46 bytes .../c2/f22c9294633a83454c838e49964c6260b8bd9b | Bin 0 -> 73 bytes .../c3/14ace8bdec75c4216b40597a03327fc6730e79 | Bin 0 -> 732 bytes .../c3/d41c86d11eeeb7fdd5a8127d1471f4ad4659c4 | Bin 0 -> 64 bytes .../c4/25c521360c0e90a40dea22d71b8207c85f8906 | Bin 0 -> 573 bytes .../c4/e230a0c24f76bd2a1526b089f272c5d62c858b | Bin 0 -> 115 bytes .../c5/38fae6414da0f76bc7207a30e55b3d3c1fa147 | Bin 0 -> 1445 bytes .../c5/8b845ae62895b09bdf158e8e8c85f3fbc91844 | Bin 0 -> 1019 bytes .../c5/d84e0a2010b831997e9d2cfd53959497a3a787 | Bin 0 -> 75 bytes .../c6/2785528127100d040a68f5d79d009bed49135e | Bin 0 -> 119 bytes .../c6/bcaf8eec5fc02d39ee8a41d4472f4845f73f9c | Bin 0 -> 46 bytes .../c6/f91df8111ffe7bd0ee8875fea6f7b8d9f5d31d | Bin 0 -> 79 bytes .../c7/16cb0381821c544805bfa28b0adf2587729d72 | Bin 0 -> 831 bytes .../c7/2b3fdf5cddb3642923df74e884c5febbdf82d5 | Bin 0 -> 79 bytes .../c8/79e5145e7854ab3f74644ba45060a1ffa174fb | Bin 0 -> 592 bytes .../c9/88291c460f4c44af053d1364f62ff5536c51da | Bin 0 -> 570 bytes .../c9/9e2fc8fc029d166faef69c43f1547a5f1974ea | Bin 0 -> 960 bytes .../c9/ddc74c52f8c038d04851fc3feae09f80f54004 | Bin 0 -> 46 bytes .../cb/2d2cfdbe2726d71ffa039968da9e9ebf0eebc1 | Bin 0 -> 93 bytes .../cc/208085544f27646de52caf4c114b363cd6b956 | Bin 0 -> 996 bytes .../cd/f66a49d9af8c39b3d8a2e815934d57ff1b300a | 1 + .../ce/549642996920ea58aadfdbd6d3bb1eaa77352d | 2 + .../ce/ea387a2307905ae8ea897d5f1184a5ad183d7a | Bin 0 -> 46 bytes .../cf/9e6dc054528d664dda89a4ec647dd9100ab8df | Bin 0 -> 1087 bytes .../cf/c31ece4da4e9928b516efe6232b74ea68373f7 | Bin 0 -> 68 bytes .../d0/275e2ccc66fdfccd9789b6bcdb60c794f8a7d0 | Bin 0 -> 2996 bytes .../d0/5539d7df6f49c364c57341c3d2fb6877673e92 | Bin 0 -> 74 bytes .../d0/69204c871c6337d55164ff95531a2a6b8a34f1 | Bin 0 -> 97 bytes .../d1/0e78a634bc9670568e336a20665c68a762aac9 | Bin 0 -> 888 bytes .../d1/b1761d11f2184bf161358678a0368e7b698e0e | Bin 0 -> 964 bytes .../d2/239149ca9120a4d7d6ec55a652bf72a0f942fc | Bin 0 -> 79 bytes .../d2/9e111c32367e21b9de99cd5bfeefe79d8f7d00 | Bin 0 -> 82 bytes .../d4/964e9c19601d06c759489cb4f9890257d7025e | Bin 0 -> 46 bytes .../d4/c015c0ee61ddc36c87c92ca54e37682b44e4dd | Bin 0 -> 46 bytes .../d5/d9be90a223dc73d319de88c3b330364f1156a2 | Bin 0 -> 74 bytes .../d6/2d7aed004b539d85387036cec843c94b41f25f | Bin 0 -> 65 bytes .../d6/c7539e9c1075e79f47d1bf389cf0464654b93a | Bin 0 -> 75 bytes .../d7/b217169089c4438422364195b26fabb00e7000 | Bin 0 -> 46 bytes .../d7/c902387ef94b09b375eb486318db8be2ea1aff | Bin 0 -> 67 bytes .../d7/ff30558d5bd6c03f1fcb0630643ffb57b1fdc2 | Bin 0 -> 46 bytes .../d8/bdcd91fa912c321720a32dcd018ff808110316 | Bin 0 -> 46 bytes .../d8/e74115f7d925992f7afcdfdb099fabd5b41ac8 | Bin 0 -> 79 bytes .../d9/2e5228c840d5eb07c022537e48211754190714 | Bin 0 -> 1095 bytes .../d9/e411a7f28e34b7924609473f3604d45c5e5651 | Bin 0 -> 903 bytes .../da/3bba6ab22e7f9a5e1da9d0c1569020c7b0b822 | Bin 0 -> 960 bytes .../da/45ffd998e84ee355486272a8bc7c9f011f1931 | Bin 0 -> 65 bytes .../da/89e9eb81c8b9fd50162622ce4ce77d29b7abae | Bin 0 -> 46 bytes .../da/b4c4cede5e6da8610ee8280071e5b3571b638c | Bin 0 -> 80 bytes .../da/de0b5ea4e845215c9ea3beff809f726fc3d115 | Bin 0 -> 74 bytes .../db/9675712bc480a7ebbf9d02e0be1bfb8f9406e8 | Bin 0 -> 617 bytes .../db/a0f15d476fa0aacdecd78a20ee22473b7f4be0 | Bin 0 -> 74 bytes .../de/320dc7bec5028d700aeca94104f5563e283024 | Bin 0 -> 78 bytes .../df/87f94893063c4ace93e7129ffe6b1bcfffa5fb | Bin 0 -> 79 bytes .../df/bda39575d0385432298f72ebdcb0f3eab66bfb | Bin 0 -> 606 bytes .../df/e8b2e2b511dded4b000ef3816133e2027805a2 | Bin 0 -> 134 bytes .../e0/3b24a06d9db8959018493e8bb8fbd551deaf29 | Bin 0 -> 123 bytes .../e1/0ae1af5188a84a28ae801c4f6092d1436b5759 | Bin 0 -> 110 bytes .../e1/97c261c1a625cc2b1e9d3ed720039d10e75181 | Bin 0 -> 86 bytes .../e1/f3e158e552590b3369ef033686b34de9387341 | Bin 0 -> 364 bytes .../e2/24749e88aabeb192da35b68821775b7ee40410 | Bin 0 -> 79 bytes .../e2/b9ecba75d2aace486570d47848c5a8d6583d15 | 2 + .../e2/cd541497743734eda7d4a03609c907f28b6c6f | Bin 0 -> 47 bytes .../e3/649d78d7514ee8181639250a5dd73c9fe0d678 | Bin 0 -> 78 bytes .../e4/d5c5195faf0ad3b7a16296b9f09e609f95e6da | Bin 0 -> 93 bytes .../e6/826a166a1f6823d64730a0f054ae5f354c4f23 | Bin 0 -> 1089 bytes .../e7/f201d8545a7d7da09d7386b9c977f85173102c | Bin 0 -> 66 bytes .../e8/6e870ff2ca8463feb201028fc36299bd3e344b | Bin 0 -> 78 bytes .../e8/86fced5f9b55b430c99c027433c2a722e30a94 | Bin 0 -> 1040 bytes .../e8/9cb5eed4f8badebb16f3d3867664a83e108766 | Bin 0 -> 125 bytes .../e9/5544d890b9a34a25acf6a62f5606fde5555986 | Bin 0 -> 79 bytes .../ea/1571283f4a49a1d6ce43163f48c0f79ca992e0 | Bin 0 -> 96 bytes .../eb/9a292a7c0739215f6aaec053182af7077c7ab7 | Bin 0 -> 2060 bytes .../ee/526f868bf8049c3a3c2925cca7caf53f753ce1 | Bin 0 -> 67 bytes .../ee/fc7c1cd3104f04700883c72f6a26624fe39535 | Bin 0 -> 76 bytes .../ef/06402dcf0b6725c7ec095edc45f28850bbeca7 | Bin 0 -> 79 bytes .../ef/4b55a95adc4146da78d43b7db4600bfa947e4e | 2 + .../ef/ae0827ac7b3771901ec01f96434184233313ae | Bin 0 -> 80 bytes .../f1/30ef2f61188ee9e9f3e88b3c8e27f2e0546fec | Bin 0 -> 967 bytes .../f1/6d1cc196227c95775c760b8f5001ae0b81859d | Bin 0 -> 47 bytes .../f1/8b83bb602bb431e656d8b05f6c7f14b072cc8e | Bin 0 -> 85 bytes .../f1/c2a3f6bb4879f79e2378570f8f595afc9941e5 | Bin 0 -> 115 bytes .../f1/c2ed073c7743972716b617c94b7ea3453186ed | Bin 0 -> 928 bytes .../f1/e390ce2d14d5f51c990d48c2801dbc27cd5964 | Bin 0 -> 1003 bytes .../f3/75d3278b7eba08b8f92472df41bea081e169bf | Bin 0 -> 46 bytes .../f4/28d668baeb676532a690503e38ee8dec12fb58 | Bin 0 -> 120 bytes .../f5/48df9c84601939ab92a3d8ecda5b26d80dfbf2 | Bin 0 -> 1045 bytes .../f7/53c69ee579383159cc8b323a7e8be9fc6f3ef7 | Bin 0 -> 75 bytes .../f8/0a139414fc819b4f0795715b5f0387718da198 | Bin 0 -> 81 bytes .../f8/5badc51b0785d67ad0dec187c1bb4366a6f80f | Bin 0 -> 80 bytes .../f8/b085c471bf7c0f68f35e3ca1b8f59bc9252cba | Bin 0 -> 46 bytes .../f9/4b262775cf4677ce6c570c372bb41f849e493f | Bin 0 -> 46 bytes .../fa/241f6225c9d6c2360820e63f5e8a56c669ad9c | Bin 0 -> 775 bytes .../fa/d5e8743a27442c802279042b8a7a8a8c5a7c73 | Bin 0 -> 96 bytes .../fa/d8c5b441d583380d1277747b0be1b1b489288f | Bin 0 -> 80 bytes .../fb/2dd5c25870077a668f75ad074d53948d4edb7b | Bin 0 -> 75 bytes .../fb/fc6ecec3b45f32e0e9f9330ee4e9ed600c3d11 | Bin 0 -> 114 bytes .../fc/9818265d74243f19bcf23e33c3ffe0e1d4d9a0 | Bin 0 -> 74 bytes .../fd/3a786e51356914336bdc7e749c8df85b6aa9a9 | Bin 0 -> 726 bytes .../fd/55da4d92c192a101fa78f4fa213b6193b4d047 | Bin 0 -> 80 bytes .../ff/647c81423cd27792ff93f0db2d68c38f28bbf1 | 2 + .../ff/c3a7458f4477ab312f9b8ba9e2152d281c9a0d | Bin 0 -> 977 bytes .../git/refs/heads/master | 2 +- .../projects/spring-cloud-core-tests/mvnw | 180 ++-- .../test/java/demo/ZuulApplicationTests.java | 1 + .../scripts/runTests.sh | 42 +- .../projects/spring-cloud-core-tests/test.sh | 1 + .../projects/spring-cloud-release/README.adoc | 62 +- .../docs/src/main/asciidoc/README.adoc | 3 +- .../docs/src/main/asciidoc/intro.adoc | 11 +- .../main/asciidoc/spring-cloud-starters.adoc | 3 +- .../spring-cloud-static/current/index.html | 2 +- .../git/hooks/commit-msg.sample | 6 +- .../git/hooks/pre-commit.sample | 24 +- .../git/hooks/pre-push.sample | 42 +- .../git/hooks/pre-rebase.sample | 58 +- .../git/hooks/pre-receive.sample | 29 +- .../git/hooks/update.sample | 129 ++- .../projects/spring-cloud-wiki/Home.asciidoc | 13 +- .../Spring-Cloud-Angel-Release-Notes.asciidoc | 26 +- ...pring-Cloud-Brixton-Release-Notes.asciidoc | 42 +- .../git/hooks/commit-msg.sample | 6 +- .../git/hooks/pre-commit.sample | 24 +- .../git/hooks/pre-push.sample | 42 +- .../git/hooks/pre-rebase.sample | 58 +- .../git/hooks/pre-receive.sample | 29 +- .../spring-cloud-wiki/git/hooks/update.sample | 129 ++- .../spring-cloud/git/hooks/commit-msg.sample | 6 +- .../spring-cloud/git/hooks/pre-commit.sample | 24 +- .../spring-cloud/git/hooks/pre-push.sample | 42 +- .../spring-cloud/git/hooks/pre-rebase.sample | 58 +- .../spring-cloud/git/hooks/pre-receive.sample | 29 +- .../spring-cloud/git/hooks/update.sample | 129 ++- .../src/test/resources/raw/initializr.yml | 6 +- .../raw/spring-cloud-gh-pages-index.html | 848 +++++++++--------- .../{internal => }/ReleaserApplication.java | 2 +- .../SpringCloudBuildsystemConfiguration.java | 30 + .../docs/SpringCloudDocsConfiguration.java | 32 + .../buildsystem/BuildsystemConfiguration.java | 51 ++ .../cloud/release/internal/spring/Args.java | 6 +- .../spring/ReleaserConfiguration.java | 59 +- .../internal/spring/SpringReleaser.java | 17 +- .../SpringCloudMavenBomParserAccessor.java | 27 + .../cloud/docs/SpringCloudDocsAccessor.java | 64 ++ .../buildsystem/MavenBomParserAccessor.java | 31 + .../internal/buildsystem}/TestPomReader.java | 8 +- .../{pom => buildsystem}/TestUtils.java | 2 +- .../docs/TestDocumentationUpdater.java | 39 +- .../internal/spring/AcceptanceTests.java | 104 ++- .../spring/ReleaserApplicationEventTests.java | 2 + .../internal/spring/SpringReleaserTests.java | 6 +- 570 files changed, 4917 insertions(+), 2905 deletions(-) rename spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/{internal/pom/SpringCloudConstants.java => cloud/buildsystem/SpringCloudBomConstants.java} (65%) create mode 100644 spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/cloud/buildsystem/SpringCloudMavenBomParser.java create mode 100644 spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/cloud/docs/SpringCloudCustomProjectDocumentationUpdater.java create mode 100644 spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/BomParser.java create mode 100644 spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/CompositeBomParser.java create mode 100644 spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/CustomBomParser.java create mode 100644 spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/GradleBomParser.java rename spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/{gradle => buildsystem}/GradleUpdater.java (95%) create mode 100644 spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/MavenBomParser.java rename spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/{pom => buildsystem}/PomUpdater.java (84%) rename spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/{pom => buildsystem}/ProjectPomUpdater.java (75%) create mode 100644 spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/VersionsFromBom.java create mode 100644 spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/VersionsFromBomBuilder.java create mode 100644 spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/docs/CustomProjectDocumentationUpdater.java rename spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/{git => github}/CachingGithub.java (99%) rename spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/{git => github}/GithubIssues.java (96%) rename spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/{git => github}/GithubMilestones.java (98%) create mode 100644 spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/github/ProjectGitHubHandler.java delete mode 100644 spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/BomParser.java delete mode 100644 spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/Versions.java rename spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/{post => postrelease}/PostReleaseActions.java (92%) rename spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/{pom => project}/ProcessedProject.java (96%) create mode 100644 spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/Project.java rename spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/{ProjectBuilder.java => ProjectCommandExecutor.java} (50%) rename spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/{pom => project}/ProjectVersion.java (89%) rename spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/{pom => project}/Projects.java (95%) rename spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/{pom => tech}/PomReader.java (71%) rename spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/pom/TestPomReader.java => spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/cloud/buildsystem/SpringCloudMavenBomParserAccessor.java (68%) rename spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/{internal/docs/ProjectDocumentationUpdaterTests.java => cloud/docs/SpringCloudCustomProjectDocumentationUpdaterTests.java} (65%) create mode 100644 spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/GradleBomParserTests.java rename spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/{pom => buildsystem}/LoggerToMavenLogTests.java (98%) create mode 100644 spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/MavenBomParserAccessor.java rename spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/{pom/BomParserTests.java => buildsystem/MavenBomParserTests.java} (59%) rename spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/{pom => buildsystem}/PomReaderTests.java (82%) rename spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/{pom => buildsystem}/PomUpdaterTests.java (87%) rename spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/{pom => buildsystem}/ProjectPomUpdaterTests.java (86%) rename spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/{pom => buildsystem}/ProjectVersionTests.java (98%) rename spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/{pom => buildsystem}/ProjectsTests.java (97%) rename spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/{pom => buildsystem}/PropertyStorerTests.java (92%) rename spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/{pom => buildsystem}/PropertyVersionChangerTests.java (90%) rename spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/{pom => buildsystem}/TestUtils.java (96%) rename spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/{pom => buildsystem}/VersionChangeAssertions.java (96%) create mode 100644 spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/VersionsFromBomTests.java rename spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/{git => github}/CachingGithubTests.java (99%) rename spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/{git => github}/GithubIssuesTests.java (97%) rename spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/{git => github}/GithubMilestonesTests.java (98%) delete mode 100644 spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/VersionsTests.java rename spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/{post => postrelease}/PostReleaseActionsTests.java (90%) rename spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/project/{ProjectBuilderTests.java => ProjectCommandExecutorTests.java} (70%) rename spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/versions/{VersionsFetcherTests.java => VersionsFromBomFetcherTests.java} (76%) create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/COMMIT_EDITMSG create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/01/07e3e2d5db844ce7b88f3e4705d39d8acaf68f create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/01/10457896955bfea6e6a05c9cf880b759d7320f create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/01/425bc517960a423c57d8955fdb3b365460a881 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/02/11cd33108da7f28c70d91542cc123a4665c47c create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/02/c8a9e576df3407af8288af8fbf5531c44dd4c9 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/02/f03fd5487cce4ce37f01933993fca0804d5803 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/03/523674a49e04a991b08cc3cef52f19fa3d2bfb create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/03/54ec3cd6cca1aabd257bd27ea2f3d368e6d2c2 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/03/645e8cee9e5ed0e1bc731e76e048d31687638f create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/03/87119a4515874cc25efff683b28be0a1ba2632 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/03/8991c238227ad7df0d1633c8f13802b4ecbf91 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/03/b4edb024bc4204b4415e070a53968dacf26b8d create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/04/a9af3e66ecd4622155a05bfb20f14b86419ee4 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/06/edce730e9443caeb7326e89d41cc1992f3e9c4 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/08/3658b0e220a59e30123517e74d212c2868da5f create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/08/630aed6042402bc1a7913af70738cb0295e683 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/08/fec0fc585e7676e856ba2a9d6ee0ddef54840b create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/09/4f552a4ae55d345c5da650877f66aebbacc180 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/0a/8f9cfaa28acfe568882c787b4016e9fd0bb186 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/0a/917582960ab2784526c132c3b660d3eb0d1c5e create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/0b/ab2242b6fda577c3131bc19b14c3cfde29c3fc create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/0c/21588e05ccdf40ee8eeeaa1757d07bb6494bb3 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/0c/2f08558d3ce04a6b06b656e2485507996f6c4e create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/0c/fb51cc4451bb3d68e8ede17f7e4d071582aca0 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/0f/33f64ea1c39c97b004ef6a033ac195960a385d create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/11/10956700d3976fd1939251ef76dbe2434701f7 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/11/48d21548560fbc1207d86bbaaad2db6022d7e4 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/11/9040e75e3792701d28f1eae6a70783aba13879 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/11/9d12c26cb60ad71c7e21c8ac5da8de2aca2568 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/11/cb65c3f7fb479d7d3d851b69749489ecb9f57d create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/11/da4b03a553337d470c099ed7a5066937fecdb0 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/11/e3fd26e437b71e04e367b2996b53085859d718 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/12/79683cf7367516cf4a58a114e39c5d9357a579 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/12/974ecb781efc46c1a17b45bb617c74efa18a16 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/12/9fbcc86f9a8f545edf3a98d71fa2a4b9f5b76b create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/12/a1f01d28f5fab915642a87b89838666f39701a create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/12/f05030cdedb3ef85a9873886c63161d120fdc2 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/14/0c6cbaa8929a5b3c29928741ad04caa9efad73 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/14/20c135339b445809162b38a692ef99941f1d95 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/14/3d12d86aa3a2b7f831a0430ce4de8b28d82a51 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/14/92f391ea966f970e44d551a68f8381ed4ea316 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/14/ce2ad4026861d89bee5f3555abbd1026726394 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/15/7e0f2dba5866e09dc01971fa0f13253d55d31e create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/16/aaaf324eb9c03214ec832bc7549aecb5610541 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/17/91825177d20268cd76aca7bed46160427c479d create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/17/fc0524a437e4808cf95cf4bcedf8c0c6498a4d create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/19/652936f550e48b4365dbe70c6fb5e5b4900a82 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/19/79e81927c315b3b0f639267b2b944b9ef7ffc3 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/19/b82895470b80fe836fdf4b24796f7b8daf6b61 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/19/c8b00f48088aff03daaeab108c0ae1f3618d98 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/1b/20a03ec26b82231e95d09e4da5e275320701dd create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/1b/8c8fa0ac1d68b2e286e21073445696555456a8 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/1c/83c189b8881a4a0173b73d374c0cd74765269a create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/1c/f8cc93f14e4ec7b3e6d2566653c1073f0a915f create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/1e/120f6fdc27b578aafd3db30500b1a0bea0d9e5 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/1e/2fae7bc4a81cc3b0c2bf94ea6b7a1497083645 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/20/005fb4c9b9ca7c85ff2aebf611942a041fef6b create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/20/b325dcc7a5a9eb5610fc1587bfcac9313ff1c1 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/22/ee771cad7c4b0f17d9b038c3d7aa6a9aebc15e create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/22/f856ada5bace418b04683f231c364cc113ed41 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/23/d1b12d777b8aff1473b5aee2f5897a9b5b8184 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/24/56ddbc58516524f228483a85b0cc2e7088af8b create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/24/60f1beed2a074726a8a0e946387f8ca0c662c8 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/24/cd2a2c1086906a2e399bbec584e1c93df1f4f9 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/24/d788c5943f09a1bbd8af6010636cb6f8b422f9 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/25/1bf5f968833778852f4975ed010b2ce64c2cc7 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/25/223594edc1481bdbfca32225a7f1c3a66ddeb9 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/25/7953d389fc8451520f2f71552fb4476277291b create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/25/97222b8c3d4b2c49c7fc3e5288da62574320c9 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/26/010ebd861c7280a21e27fcf77164624d5bd15d create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/26/914b5d4da8bc81fe4d5dc108190d959994824c create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/27/05064df8cd6bb37bd69acc6e7033fc2bd5d80e create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/27/f3a58a7573fb5326d07fd419a444101b92b864 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/28/4b968b18fec7863ce2f240144f82ba947041bb create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/28/96b7f081b5147763ebbf2a0fdba61dc8636317 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/29/b76ab14c1aa22b2a4dea14ad58c91e20d8f817 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2a/888c165936552d97605b747cb853bcd0a7dc31 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2a/89d4de6653c81c21ab213f9c97da05c24cda80 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2a/af0a96ead26ce1615fb768875d9941b149f2fa create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2b/17d9d304d10eaf8ab29f0cd9c4b6ad7a47594a create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2b/2235bce7e286b5aada0dbb6bb23da5f8cb3375 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2b/301a415819e421e0679ca2448bd476ac801656 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2b/304681b9f0dd1c4a1a6f100639497767691b93 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2b/39bd0c6257a17a78afd9b35f84fd44298c227e create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2c/0189ee09ae9cdf4db26cec9e3dfa27d9cb5e22 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2c/cb490a582bc294ce60613169ee833a7b575701 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2d/6ee32362243ef322a02ec364fde6fc657c091e create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2d/d01cf45e56702606e2e4be654cebe6c34a5d1a create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2f/0ebb437dabdc79b070a4bd8033da25626eb558 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/30/b21da69c596b83ef6c6b228b1176550a40eb87 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/30/ddc0d503df93b983f7a8ffd8d28f80290d9fe0 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/31/1a460e853e1bd9795d6fcae056a8f71d2d605a create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/31/3077eb3d52dd4a2bec0d6cb9c12a1b15e11a1c create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/31/6f5d1755c84958b17e6623dce8a3fbf677627a create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/31/b09ff4de675cf3036d5299868289ce5629f4eb create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/31/ed9383295f651dd92f504b787ec0753a23740e create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/31/fdaed8b7dbaabbe01424c9a06fc74cb0a7c4f9 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/32/b0b24b34d2ef8ac7c63c07d687d48efbd370aa create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/33/764af82504ed9f0099d4d34aaa0a62032e1f94 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/33/f1976f98d889dec82ca56d2fb24c7c3bcffc17 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/34/ebc770b3976d4d69183b99d69e3c6611130b89 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/35/2a2d85940cf5bf182b377eb64661115387f987 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/35/433764d56cef44b56cf0c161abed6eea40cad9 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/35/625e0d2f5d6ed98c236d3fe5eb74118411ded1 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/35/8dbed1f9e69a7d91797f13e20510c615db3bb6 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/37/cb16dbfa3e7423a69a17ec517edd97fcb7ef02 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/37/f118c7184e629851b89216772a45cac4d1147c create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/38/0c542cf4bded22d0edbefd27107fe372e0e62e create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/38/3d81c39f4da8ee934b03dba7e753ed051af409 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/38/6b51f433ce2543bccb96adff49a6db306b2355 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/38/f222cec182df9dc13b627fe2ea51e707c00905 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/39/070812bee6a0498396ee1441278f5678caf170 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/39/f2f11ed1f77f0259967e53ecbd946d5b422536 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/3b/0be4147d56f425a14d04a992365d061ef4b992 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/3b/87ac49b17c51472014e581c7e26a6b6a76096f create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/3b/9a2763e46ac047c65e71daecddcf8f12427c2d create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/3b/afc466462a9f0a5c15c9933a065f7c6b6dd0a4 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/3c/0844a83a874210e64f833767e922d1f3f4be4d create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/3c/3e546f40587167ace1fc720e1b68292bc7c867 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/3c/d2b3a67331365eb7aef83e9f39a94625becb6a create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/3d/6638244ea054bd71ad5d715c2e86b17684f448 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/3d/7257e7634312e2433d345ed71b33627a28e19b create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/3f/02bbda85368e9d2578d76bd1b7d2dd98f70c0d create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/3f/ab0ebb702a6a6c9836111a102a17c2134b40a9 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/40/7bd6ca2865aa7ad2da29372083278debf1b797 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/41/112c92c1058ed0c7c09e21215bf7ee58d09e1d create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/41/5e77f8b87b7410fb2e332f5b6cebb47b7ab3b5 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/41/f788ad3541b9bba23c35080010defe869a4d43 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/43/c1869b1f85225c2bc348f5484d45341e871f92 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/44/a0c3b71edc9b6cd61dda0a9b7fe75c9486177d create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/44/a77e7992f88f44843f0626c8d1593d451ed53e create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/45/4c347a24481106a559a52744cfa7d41c602939 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/45/8049c271ed9f3849d8f3b662728c3300af6b9b create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/45/83d38d6007f03325f3116ff8d3d551432b615f create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/45/ad05561a45304f9a6d6b7e6be47ee5fcfa2636 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/45/f56be8663e79defd784fde046040df3cc7c503 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/47/52d372a47df547b2e6977d17985a0a2da172d1 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/47/685c671d98b9f246084b5573d2e20667bbde04 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/47/75c95c39f71376410fbf299721056058a7028a create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/47/b42db8e73abec42f87af427aa7fbf414dcfbfd create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/48/5bc91281552b177823505477795d82fd13a3d1 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/48/f47535c1303d038153ae84851abcca60626239 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/49/2833a3ff9bf5a82996ecbd9a8f231eb76f692d create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/49/e41b0e2c61267e191ecae58fce84591da7d419 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/4b/3b141115ff56d4d83493f7e8bb89fe9250f274 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/4b/cd2c7e3e5342522c6f8b7746870d8685d092ea create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/4d/1c87e362ab882f012dd4048eaaa9624562083b create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/4e/7364be9bad7ffcc3ce046f75c0f8b3d81c18e0 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/4f/5e54d0dbfdada2dfb67d8e868bb48e5329e124 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/4f/9b11051a1e02327e15ca4cd0244e779fabbc7f create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/4f/f429466a2a10f5377438526c8511ce0407df1c create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/50/37bc102aa7f65329b5d3cf9c1e5894cc3337db create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/50/745cc5616a1c134dbb8762464d16f0d8ae1ea9 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/50/b9352be60f180b3e9e6cedc670b942a69942cd create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/50/bf3c1d6afc8056227f42a56246ca63aaf9af5a create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/51/401846a6cf2780a52bd50afc3d1ead315ec351 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/51/715f9f89d8cdf74328d8c25694b170bcbe99b6 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/52/450669e7653a800d766e9eb350a07df4f661af create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/52/7842f72663aaf32bc9bbe8c4709d25d217e73d create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/52/b0c65e622564413d50f64906b9cfbd5551ae6f create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/53/80912fbb66f5bfd7e53fee55a0637daa1ec995 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/55/72d7476881992748fa29d7963f98aa0162ae5a create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/56/7f2b355a468df1d93378a83b574afcce6d0c6e create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/56/ab1b49248acb400882e03f26ce497fe6ecdd1e create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/57/3df7e0031efd9e07d22fa7b9d7b5c623dcb476 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/58/412ad107c42aef9def9fa5efebdea718c20ff8 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/58/968f9b2a21276b497c299eff74d9b42cec071e create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/58/974f0d95a0aac4d970f8d1419a8cd51a19b54e create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/59/27da3bd9c4a3d0473368120959099cf6ad6921 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/59/9ee8c973ca27b36118a7abfd49753bfa20748a create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/59/b21cbd452a5b2f0666a7d5a6cafb0195acb53f create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/5a/3ebafc7eaa5e8c40ca7368a4380b876b7223ca create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/5c/78fcfbaa883608f92f9b6f6d81d0405713c8a3 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/5c/d0b320cf839585c1bf289b86ada552db0239b3 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/5d/0bc4781d05d90f3cbea3a0b21e8470a0f9aafa create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/5e/f7b1694925c635bf8bf7f8e2ff5605c4541a14 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/5f/bdd0e0606a0abea222a56af0d4b72f22445a07 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/5f/bde9259f129e7dc734d0d18ea65d61e4c7e3f6 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/5f/c020dfaf2838ef1920f646f7bd3881b67dcd74 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/60/c776b859ce72f528fc97788f0e74648d638e4d create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/62/3df4da4a46cc6aba1b12baf403a9d6aef8b9a4 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/62/4705db59c80e6b9e92556a1131c9b8412ea290 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/62/7ff09e191ebbfdb60a2b0d07448285d4ffbf4e create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/62/dba8d7454e83c79601994ce30f3a796664bad4 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/62/e27f2ef3f1f71f6662d2dc71c38cca37d2a455 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/63/123e5ba7d9b6d7113c7f3a5260f833a40e9043 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/63/c4fc59088e2b8b61068c8504bee44588c1ed33 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/65/2d5fdab1df59a05f18411e19fb48ec15d1d20d create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/66/3871ead7de37140d3b877d68fa1f502fdaa22b create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/68/4756480e018f36d7c54129e1c5bf553791401a create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/69/640d209c58e7f4a21392d77e56589213443701 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/69/d881a24ac2e81f709c7975b60d67bedc2910e9 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/6a/1c8198a8111eae725a96569a973f8c7b163a44 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/6a/522240457a2964e091e0c6072596b2dd54574b create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/6a/5849d491f72d0d0e19c59b82910d2818cbf319 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/6a/ac795533ced5075a9dc23e26dd8bfdc3303dff create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/6a/e15afc58e37c0f50eb715d6f17c64caba45bb9 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/6b/b5efa01252588d84c5247351cbaad227cb688b create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/6b/f656aadc9fa29cb5f103d769ef7278be42cc09 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/6c/db973f7dad5ef98087b0ae81661d5ac7e87dd1 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/6d/7a0de1943be4ac21fd4807b12617d9f7cf8ca7 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/6d/c5c50f5bdbe30104dd0a28c575bd508822bb66 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/6e/452327e0328b29415cb2020b3db6ef5346b966 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/6e/7433a4d834cde4968e648e239074ac2ab01eba create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/6e/f3d5fd3e7a1e337ccbb0ec425c39f0ddda6e58 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/6f/9bcef519991efbd2a1edf823b6b1e4ea7c6a36 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/6f/a85d850e92c192a604df0183f79d5e641f6a68 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/70/8824c87cc9701e1dc8afc46dd90d9d6371265a create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/70/da6cfc16be6726c80e97d5e766bd4370e90f3a create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/70/ebdd9cdcddd4bc26e444ee144095f98b9fb2cd create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/71/cfaed6e068995e8cb84ac16391c3ef67241dc2 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/73/58c382cc26de8c5fd2e60b1c771d7da5121d56 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/73/ee715eacc3af6cb4913d2c49b1aa8a872e306a create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/74/f4cdbe80d8aa9d9185c2e64edcd76a418b9611 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/75/040ca5a5a69bffb3fcc4ad55dc122102681d4f create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/78/5f31d562e1e8be2a9501438e248589256cfd53 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/79/5ddee6045c6c6b66998a61890480bb0f84e6b4 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/7a/dedd63e8661b09063362a42c65e98931d290cd create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/7c/75b6c86e3454e70c51abcb1152cfb9bba71d16 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/7d/2fd94b48fd9907168c90d5bd9400a5b6ebc5ad create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/7d/b28ad5103383fc58f064337914f5d9198ee53b create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/7d/b90d5b8d1476acb720df185a9292ab331e3671 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/7e/e7d5b098e9a83450c74593b3cdf9a214a631c7 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/7f/810bf6c1bae0094da57ce27cee853c2a0b4c74 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/80/74285cbd728cc9acab61849e56d1d8ae6cdfa9 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/80/88eec3ed1a40ca8b4aebc988df41c9f5983e89 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/82/16f75d45089de99f435b1084d583c6046fef4a create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/82/bc5729b96b650c316a83a886e6ce1f7133c520 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/83/724e8d9baace89a740c038883d7c3ea02df860 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/84/cc3f4746967802e002afaa29239e5f5cf9a8b8 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/84/de6cca8989402dc7727e57708990476e167fe6 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/85/23b544eab61145ee4ca5c4ffdf1a9a2579273b create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/86/46903988a0d24ec525f59e7ca51643e3bd46ca create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/86/9ff1cb27c20295c7d747ddc4a42f54db6ce1f8 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/86/a35cc5698f9f5f5e26790b8428baaf16f11bbe create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/86/d61a366ccb18762a1342a6b9df7313bcfc1bda create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/87/227e660aae5156fc51f489d33b450e23611170 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/87/86f1d1ef84031fb18cb563aaa1c229c8ac1d76 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/87/e06c77e7a4741f55f81c2b8acfe76cf43c97cc create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/88/341e604196fa20a93a3cf839625f6818cef430 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/89/0196e16ebf8117619704a45007328746a7c731 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/89/52c7993f64ef7fa6d04abfef45d4dec447ba9d create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/89/88c9719cd8499876c0bb9340d1cc39f10ed9c6 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/89/f8b6b3f22f94a11cd5398dd62b1d5931eb78ce create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/8a/8fa9237e8d4d3c7a591169414811836e3ac5cd create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/8a/f9597e67ea223068ac8cc4ed02968550a52e47 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/8b/7bac5cee91811657b1fbf1038054ccbe6cda12 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/8c/58d1f69a0e67824089fd0a982c3fc351839253 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/8c/b1d686e94588d64d9ba56f3d853922d669a7c9 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/8e/180a276e8e4bfa288c44651e801877743c529d create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/8f/8826477c2ac54efa42a24e4f1d4e53eb3baa57 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/8f/b818a646b250477e4e3eac1ea66e55b8106538 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/91/c9f4528c41270c010decd837f99d85dbb4ba8e create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/92/e89353a12573455789b028b079b54c03dd4c87 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/93/9c3ac54e2dd75545379c4875f036644e03e768 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/93/9dc265a8bc24f1b4ac881f10aaac2016d298dc create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/95/4057eb220ff7b5a035660720ea28a2f1638c34 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/95/59ebc4eb06fbd8ad2c82291e7c4de1ebc34312 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/95/d4e2f868179a88d6a7aafcd775b1b73e15a60f create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/97/bc012fe27c3410a0b4ce57a3280f0be81c93a3 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/98/2a6cc3e7fbb1ae718011a8be2d1ff668fc4c79 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/99/2e446e141badfad4bf2efafa8607892167e7b8 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/9a/74a89e21c624c32c2393171a4ed38362f43dc9 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/9a/74fac61b5d52bd176b7cc6848169e5df41b7bd create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/9a/75fa9181e0b24eee88da728dd753cdb392bd9a create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/9a/f54972e023a5ad469c7c90c6353d338fbaa2de create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/9c/4bd7daeee9acb66233c35ccc00016f528b0345 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/9c/65acf855617b2985ad2a3770f13689e285fcc8 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/9c/892482b651153eaedc763217fcf6952faf3727 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/9c/f7027887cb2651965e9fbcd611371ee355f0b2 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/9d/29487d49ee0db941d8a13e02c427021defbfd4 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/9d/901fbb29aca332080be170cf704cd63d8cbf8d create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/9e/938321fecc3e159c33557f1d72ace32d97e90b create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/9e/abe4ec02f5b35e1f3418c9ae7a3c8dc2f98c21 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/9f/0dc8976fcd237a63a447b9c060f6c268ab09c7 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/9f/77ed0204270fbc27809d1520f2f7563123320c create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a1/4a3a950df4cd8bddc5baa9bfa28964565f503c create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a4/17e8a6626fdddc294945cfa60c3dd10810c7f1 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a4/8e0be77a34f8625337aa00af0a3597138e1c22 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a4/aa923834bff292a4de0b138ee68b0aad124e56 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a4/c7916e61bbaba1d06e9615aa80e656bb01a764 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a4/e268da08e5d1a5b450489ef85c1af6026b7a57 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a4/ea7a9b018dc5d0c3fe233264c2c788fbaf483d create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a5/46dbd036af810ee849d69746ef4b00ad014bea create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a6/478a790da7368fd603b7021406314cbf30e3ad create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a7/5ba41fed2e989551ec02a953a45cf7a18af7c8 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a7/b2fa680fa3929421169417a573e77dc52bc465 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a8/a89b6bbde6136319f3f1d625a8f9e6f6e9aacc create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a9/72fc48d296c3646c2b85ade1b826b6a5156cd2 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a9/8ae2cddee35fd2107281c1d9afef4582f2f2fd create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a9/b9a9a314668d4d3fb692f8dfc4ee560251fb15 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a9/c4996d99434452c25dc51f033128a39fbfbc45 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a9/fc24996247f4bc2db2984c03197c358fb210a4 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ab/69c38dfca3dbd22ce8ef76056f723a9f039ea8 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ac/dce9405147ec335281985c08936a2ff907c793 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ad/7466ae1885b313d73901fad5617cc5b141377b create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ad/d1fc2ced5f64c92c7cb21b482d87353ec30879 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ae/ef09d318e80a96a54332a3eccfa72d6cc56689 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/af/24209a10dbad154187b74a351d288005a9e78d create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/af/52b5bd0ad18f90cae92306181d51a189c0afe4 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/af/e7ade93a7a1004067d7c094922ab0bd66a42cb create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b0/315c87b1cc581a12a54b07b96dc8925fcd5fc0 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b0/f24ef1127df040200772fb30ce48fe44abb68e create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b1/88afc70c6bef38582788459a99a7986182d1dc create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b3/e2f86fa9f2c505b578d55ec9ebd144976c0821 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b4/4c7852d1b04ff2fd1b63091ef51631ac272811 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b4/7eb57c3f30fbbf44814063013ae2223d008409 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b4/cc9ec916cd76a6a5826fe71b08e826042ed594 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b6/02fa301fdd5688861011e9b8ffb05446c62468 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b7/a716a20653e1c5ac77228a6395b58d108b41f9 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b7/ca9026300d3fdd9af2595367b0afb3dc9165d2 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b8/21b31c565e861f53a2b34d01fe23d902be2f6a create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b8/343fab0cd2dba07c7b3cbbb02469e04dcbd3c9 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b8/b474a46196311025c6a8e7c9f53bb747befc73 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b8/cba47468ff99d781fc85c8ff0686611720d87c create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b9/4b21df294675f5a6e0da7a5c0a2e23183466d3 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b9/69510eb1c782107181a09b4ebfcff5e120ac1d create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b9/ec320a66eca056fd340056619de894e9a4d7b7 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/bb/eb269763559f8a138b18dc7a31e16092177b96 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/bc/27392f0e73ce9aa93dcf154151cfc78b77cd1d create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/bc/29315f3b2e1ecac8c972352cb9aa4d582f8b06 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/bc/6dccdc582c505732b22f1e67625b39561f491b create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/bd/29978a7edcd2f02644fa90165beed8a01cca81 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/bd/6d7601e41d763328a6fb90fd11405dd87ebc53 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/bd/9b9c7805089d87771580fba42e0a760dced62d create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/be/34b6152b679da2e544f3117341d69a8f45b4d7 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/bf/afdf41c1fb4f2b487f620204c84a9ccca00ed1 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/bf/dda449a5c0245fdd90e8901bb238013a67bc3b create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c0/484bb5262778ec6bc2be62e742236d565b8427 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c1/362812db9d81bf0ea9d5044e8984957a526f9e create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c1/849267ee0c808e8777aaae5894575d1afc8b19 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c1/e0bfadd1ddef749d91f9eed680bfe477506569 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c2/7fd002fb181487186842a6fe9a888c8a3302f5 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c2/f22c9294633a83454c838e49964c6260b8bd9b create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c3/14ace8bdec75c4216b40597a03327fc6730e79 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c3/d41c86d11eeeb7fdd5a8127d1471f4ad4659c4 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c4/25c521360c0e90a40dea22d71b8207c85f8906 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c4/e230a0c24f76bd2a1526b089f272c5d62c858b create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c5/38fae6414da0f76bc7207a30e55b3d3c1fa147 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c5/8b845ae62895b09bdf158e8e8c85f3fbc91844 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c5/d84e0a2010b831997e9d2cfd53959497a3a787 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c6/2785528127100d040a68f5d79d009bed49135e create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c6/bcaf8eec5fc02d39ee8a41d4472f4845f73f9c create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c6/f91df8111ffe7bd0ee8875fea6f7b8d9f5d31d create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c7/16cb0381821c544805bfa28b0adf2587729d72 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c7/2b3fdf5cddb3642923df74e884c5febbdf82d5 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c8/79e5145e7854ab3f74644ba45060a1ffa174fb create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c9/88291c460f4c44af053d1364f62ff5536c51da create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c9/9e2fc8fc029d166faef69c43f1547a5f1974ea create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c9/ddc74c52f8c038d04851fc3feae09f80f54004 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/cb/2d2cfdbe2726d71ffa039968da9e9ebf0eebc1 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/cc/208085544f27646de52caf4c114b363cd6b956 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/cd/f66a49d9af8c39b3d8a2e815934d57ff1b300a create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ce/549642996920ea58aadfdbd6d3bb1eaa77352d create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ce/ea387a2307905ae8ea897d5f1184a5ad183d7a create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/cf/9e6dc054528d664dda89a4ec647dd9100ab8df create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/cf/c31ece4da4e9928b516efe6232b74ea68373f7 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d0/275e2ccc66fdfccd9789b6bcdb60c794f8a7d0 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d0/5539d7df6f49c364c57341c3d2fb6877673e92 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d0/69204c871c6337d55164ff95531a2a6b8a34f1 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d1/0e78a634bc9670568e336a20665c68a762aac9 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d1/b1761d11f2184bf161358678a0368e7b698e0e create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d2/239149ca9120a4d7d6ec55a652bf72a0f942fc create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d2/9e111c32367e21b9de99cd5bfeefe79d8f7d00 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d4/964e9c19601d06c759489cb4f9890257d7025e create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d4/c015c0ee61ddc36c87c92ca54e37682b44e4dd create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d5/d9be90a223dc73d319de88c3b330364f1156a2 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d6/2d7aed004b539d85387036cec843c94b41f25f create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d6/c7539e9c1075e79f47d1bf389cf0464654b93a create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d7/b217169089c4438422364195b26fabb00e7000 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d7/c902387ef94b09b375eb486318db8be2ea1aff create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d7/ff30558d5bd6c03f1fcb0630643ffb57b1fdc2 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d8/bdcd91fa912c321720a32dcd018ff808110316 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d8/e74115f7d925992f7afcdfdb099fabd5b41ac8 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d9/2e5228c840d5eb07c022537e48211754190714 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d9/e411a7f28e34b7924609473f3604d45c5e5651 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/da/3bba6ab22e7f9a5e1da9d0c1569020c7b0b822 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/da/45ffd998e84ee355486272a8bc7c9f011f1931 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/da/89e9eb81c8b9fd50162622ce4ce77d29b7abae create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/da/b4c4cede5e6da8610ee8280071e5b3571b638c create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/da/de0b5ea4e845215c9ea3beff809f726fc3d115 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/db/9675712bc480a7ebbf9d02e0be1bfb8f9406e8 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/db/a0f15d476fa0aacdecd78a20ee22473b7f4be0 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/de/320dc7bec5028d700aeca94104f5563e283024 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/df/87f94893063c4ace93e7129ffe6b1bcfffa5fb create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/df/bda39575d0385432298f72ebdcb0f3eab66bfb create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/df/e8b2e2b511dded4b000ef3816133e2027805a2 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e0/3b24a06d9db8959018493e8bb8fbd551deaf29 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e1/0ae1af5188a84a28ae801c4f6092d1436b5759 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e1/97c261c1a625cc2b1e9d3ed720039d10e75181 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e1/f3e158e552590b3369ef033686b34de9387341 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e2/24749e88aabeb192da35b68821775b7ee40410 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e2/b9ecba75d2aace486570d47848c5a8d6583d15 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e2/cd541497743734eda7d4a03609c907f28b6c6f create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e3/649d78d7514ee8181639250a5dd73c9fe0d678 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e4/d5c5195faf0ad3b7a16296b9f09e609f95e6da create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e6/826a166a1f6823d64730a0f054ae5f354c4f23 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e7/f201d8545a7d7da09d7386b9c977f85173102c create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e8/6e870ff2ca8463feb201028fc36299bd3e344b create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e8/86fced5f9b55b430c99c027433c2a722e30a94 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e8/9cb5eed4f8badebb16f3d3867664a83e108766 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e9/5544d890b9a34a25acf6a62f5606fde5555986 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ea/1571283f4a49a1d6ce43163f48c0f79ca992e0 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/eb/9a292a7c0739215f6aaec053182af7077c7ab7 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ee/526f868bf8049c3a3c2925cca7caf53f753ce1 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ee/fc7c1cd3104f04700883c72f6a26624fe39535 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ef/06402dcf0b6725c7ec095edc45f28850bbeca7 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ef/4b55a95adc4146da78d43b7db4600bfa947e4e create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ef/ae0827ac7b3771901ec01f96434184233313ae create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f1/30ef2f61188ee9e9f3e88b3c8e27f2e0546fec create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f1/6d1cc196227c95775c760b8f5001ae0b81859d create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f1/8b83bb602bb431e656d8b05f6c7f14b072cc8e create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f1/c2a3f6bb4879f79e2378570f8f595afc9941e5 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f1/c2ed073c7743972716b617c94b7ea3453186ed create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f1/e390ce2d14d5f51c990d48c2801dbc27cd5964 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f3/75d3278b7eba08b8f92472df41bea081e169bf create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f4/28d668baeb676532a690503e38ee8dec12fb58 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f5/48df9c84601939ab92a3d8ecda5b26d80dfbf2 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f7/53c69ee579383159cc8b323a7e8be9fc6f3ef7 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f8/0a139414fc819b4f0795715b5f0387718da198 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f8/5badc51b0785d67ad0dec187c1bb4366a6f80f create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f8/b085c471bf7c0f68f35e3ca1b8f59bc9252cba create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f9/4b262775cf4677ce6c570c372bb41f849e493f create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/fa/241f6225c9d6c2360820e63f5e8a56c669ad9c create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/fa/d5e8743a27442c802279042b8a7a8a8c5a7c73 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/fa/d8c5b441d583380d1277747b0be1b1b489288f create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/fb/2dd5c25870077a668f75ad074d53948d4edb7b create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/fb/fc6ecec3b45f32e0e9f9330ee4e9ed600c3d11 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/fc/9818265d74243f19bcf23e33c3ffe0e1d4d9a0 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/fd/3a786e51356914336bdc7e749c8df85b6aa9a9 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/fd/55da4d92c192a101fa78f4fa213b6193b4d047 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ff/647c81423cd27792ff93f0db2d68c38f28bbf1 create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ff/c3a7458f4477ab312f9b8ba9e2152d281c9a0d create mode 100755 spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/test.sh rename spring-cloud-release-tools-spring/src/main/java/org/springframework/cloud/release/{internal => }/ReleaserApplication.java (98%) create mode 100644 spring-cloud-release-tools-spring/src/main/java/org/springframework/cloud/release/cloud/buildsystem/SpringCloudBuildsystemConfiguration.java create mode 100644 spring-cloud-release-tools-spring/src/main/java/org/springframework/cloud/release/cloud/docs/SpringCloudDocsConfiguration.java create mode 100644 spring-cloud-release-tools-spring/src/main/java/org/springframework/cloud/release/internal/buildsystem/BuildsystemConfiguration.java create mode 100644 spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/cloud/buildsystem/SpringCloudMavenBomParserAccessor.java create mode 100644 spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/cloud/docs/SpringCloudDocsAccessor.java create mode 100644 spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/buildsystem/MavenBomParserAccessor.java rename {spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom => spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/buildsystem}/TestPomReader.java (82%) rename spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/{pom => buildsystem}/TestUtils.java (96%) diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/SpringCloudConstants.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/cloud/buildsystem/SpringCloudBomConstants.java similarity index 65% rename from spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/SpringCloudConstants.java rename to spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/cloud/buildsystem/SpringCloudBomConstants.java index bae04b89..299bc141 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/SpringCloudConstants.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/cloud/buildsystem/SpringCloudBomConstants.java @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * https://www.apache.org/licenses/LICENSE-2.0 + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -14,22 +14,32 @@ * limitations under the License. */ -package org.springframework.cloud.release.internal.pom; +package org.springframework.cloud.release.cloud.buildsystem; /** * @author Marcin Grzejszczak */ -final class SpringCloudConstants { +final class SpringCloudBomConstants { + // boot static final String SPRING_BOOT = "spring-boot"; static final String BOOT_STARTER_ARTIFACT_ID = "spring-boot-starter"; static final String BOOT_STARTER_PARENT_ARTIFACT_ID = BOOT_STARTER_ARTIFACT_ID + "-parent"; static final String BOOT_DEPENDENCIES_ARTIFACT_ID = "spring-boot-dependencies"; + + // sc-build static final String CLOUD_DEPENDENCIES_PARENT_ARTIFACT_ID = "spring-cloud-dependencies-parent"; static final String BUILD_ARTIFACT_ID = "spring-cloud-build"; - private SpringCloudConstants() { + // sc-release + static final String CLOUD_DEPENDENCIES_ARTIFACT_ID = "spring-cloud-dependencies"; + static final String CLOUD_ARTIFACT_ID = "spring-cloud"; + static final String CLOUD_RELEASE_ARTIFACT_ID = "spring-cloud-release"; + static final String CLOUD_STARTER_ARTIFACT_ID = "spring-cloud-starter"; + static final String CLOUD_STARTER_PARENT_ARTIFACT_ID = "spring-cloud-starter-parent"; + + private SpringCloudBomConstants() { throw new IllegalStateException("Don't instantiate a utility class"); } diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/cloud/buildsystem/SpringCloudMavenBomParser.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/cloud/buildsystem/SpringCloudMavenBomParser.java new file mode 100644 index 00000000..af60995b --- /dev/null +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/cloud/buildsystem/SpringCloudMavenBomParser.java @@ -0,0 +1,213 @@ +/* + * Copyright 2013-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.release.cloud.buildsystem; + +import java.io.File; +import java.util.LinkedHashSet; +import java.util.Set; + +import org.apache.maven.model.Model; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.cloud.release.internal.ReleaserProperties; +import org.springframework.cloud.release.internal.buildsystem.CustomBomParser; +import org.springframework.cloud.release.internal.buildsystem.VersionsFromBom; +import org.springframework.cloud.release.internal.buildsystem.VersionsFromBomBuilder; +import org.springframework.cloud.release.internal.project.Project; +import org.springframework.cloud.release.internal.tech.PomReader; +import org.springframework.util.StringUtils; + +import static org.springframework.cloud.release.cloud.buildsystem.SpringCloudBomConstants.BOOT_DEPENDENCIES_ARTIFACT_ID; +import static org.springframework.cloud.release.cloud.buildsystem.SpringCloudBomConstants.BOOT_STARTER_ARTIFACT_ID; +import static org.springframework.cloud.release.cloud.buildsystem.SpringCloudBomConstants.BOOT_STARTER_PARENT_ARTIFACT_ID; +import static org.springframework.cloud.release.cloud.buildsystem.SpringCloudBomConstants.BUILD_ARTIFACT_ID; +import static org.springframework.cloud.release.cloud.buildsystem.SpringCloudBomConstants.CLOUD_ARTIFACT_ID; +import static org.springframework.cloud.release.cloud.buildsystem.SpringCloudBomConstants.CLOUD_DEPENDENCIES_ARTIFACT_ID; +import static org.springframework.cloud.release.cloud.buildsystem.SpringCloudBomConstants.CLOUD_DEPENDENCIES_PARENT_ARTIFACT_ID; +import static org.springframework.cloud.release.cloud.buildsystem.SpringCloudBomConstants.CLOUD_RELEASE_ARTIFACT_ID; +import static org.springframework.cloud.release.cloud.buildsystem.SpringCloudBomConstants.CLOUD_STARTER_ARTIFACT_ID; +import static org.springframework.cloud.release.cloud.buildsystem.SpringCloudBomConstants.CLOUD_STARTER_PARENT_ARTIFACT_ID; +import static org.springframework.cloud.release.cloud.buildsystem.SpringCloudBomConstants.SPRING_BOOT; + +class SpringCloudMavenBomParser implements CustomBomParser { + + private static final Logger log = LoggerFactory + .getLogger(SpringCloudMavenBomParser.class); + + @Override + public boolean isApplicable(File root, ReleaserProperties properties, + Set projects) { + return isMaven(root) && root.getName().startsWith("spring-cloud") || projects + .stream().anyMatch(project -> BUILD_ARTIFACT_ID.equals(project.name)); + } + + @Override + public VersionsFromBom parseBom(File root, ReleaserProperties properties) { + VersionsFromBom springCloudBuild = springCloudBuild(root, properties); + VersionsFromBom boot = bootVersion(root, properties); + if (log.isDebugEnabled()) { + log.debug("Added Spring Cloud Build [{}] and boot versions [{}]", + springCloudBuild, boot); + } + return new VersionsFromBomBuilder().thisProjectRoot(root) + .releaserProperties(properties).projects(springCloudBuild, boot).merged(); + } + + private VersionsFromBom springCloudBuild(File root, ReleaserProperties properties) { + String buildVersion = buildVersion(root, properties); + if (StringUtils.isEmpty(buildVersion)) { + return VersionsFromBom.EMPTY_VERSION; + } + VersionsFromBom scBuild = new VersionsFromBomBuilder().thisProjectRoot(root) + .releaserProperties(properties).merged(); + scBuild.add(BUILD_ARTIFACT_ID, buildVersion); + scBuild.add(CLOUD_DEPENDENCIES_PARENT_ARTIFACT_ID, buildVersion); + return scBuild; + } + + private String buildVersion(File root, ReleaserProperties properties) { + String buildVersion = properties.getFixedVersions().get(BUILD_ARTIFACT_ID); + if (StringUtils.hasText(buildVersion)) { + return buildVersion; + } + File pom = new File(root, properties.getPom().getThisTrainBom()); + if (!pom.exists()) { + return ""; + } + Model model = PomReader.pom(root, properties.getPom().getThisTrainBom()); + String buildArtifact = model.getParent().getArtifactId(); + log.debug("[{}] artifact id is equal to [{}]", + CLOUD_DEPENDENCIES_PARENT_ARTIFACT_ID, buildArtifact); + if (!CLOUD_DEPENDENCIES_PARENT_ARTIFACT_ID.equals(buildArtifact)) { + throw new IllegalStateException( + "The pom doesn't have a [spring-cloud-dependencies-parent] artifact id"); + } + buildVersion = model.getParent().getVersion(); + log.debug("Spring Cloud Build version is equal to [{}]", buildVersion); + return buildVersion; + } + + private String boot(File root, ReleaserProperties properties) { + String bootVersion = properties.getFixedVersions().get(SPRING_BOOT); + if (StringUtils.hasText(bootVersion)) { + return bootVersion; + } + String pomWithBootStarterParent = properties.getPom() + .getPomWithBootStarterParent(); + File pom = new File(root, pomWithBootStarterParent); + if (!pom.exists()) { + return ""; + } + Model model = PomReader.pom(root, pomWithBootStarterParent); + if (model == null) { + return ""; + } + String bootArtifactId = model.getParent().getArtifactId(); + log.debug("Boot artifact id is equal to [{}]", bootArtifactId); + if (!SpringCloudBomConstants.BOOT_STARTER_PARENT_ARTIFACT_ID + .equals(bootArtifactId)) { + if (log.isDebugEnabled()) { + throw new IllegalStateException("The pom doesn't have a [" + + SpringCloudBomConstants.BOOT_STARTER_PARENT_ARTIFACT_ID + + "] artifact id"); + } + return ""; + } + return model.getParent().getVersion(); + } + + VersionsFromBom bootVersion(File root, ReleaserProperties properties) { + String bootVersion = boot(root, properties); + if (StringUtils.isEmpty(bootVersion)) { + return VersionsFromBom.EMPTY_VERSION; + } + log.debug("Boot version is equal to [{}]", bootVersion); + VersionsFromBom versionsFromBom = new VersionsFromBomBuilder() + .thisProjectRoot(root).releaserProperties(properties).merged(); + versionsFromBom.add(SPRING_BOOT, bootVersion); + versionsFromBom.add(BOOT_STARTER_PARENT_ARTIFACT_ID, bootVersion); + versionsFromBom.add(BOOT_DEPENDENCIES_ARTIFACT_ID, bootVersion); + return versionsFromBom; + } + + @Override + public Set setVersion(Set projects, String projectName, + String version) { + Set newProjects = new LinkedHashSet<>(projects); + switch (projectName) { + case SPRING_BOOT: + case BOOT_STARTER_ARTIFACT_ID: + case BOOT_STARTER_PARENT_ARTIFACT_ID: + case BOOT_DEPENDENCIES_ARTIFACT_ID: + updateBootVersions(newProjects, version); + break; + case BUILD_ARTIFACT_ID: + case CLOUD_DEPENDENCIES_PARENT_ARTIFACT_ID: + updateBuildVersions(newProjects, version); + break; + case CLOUD_ARTIFACT_ID: + case CLOUD_DEPENDENCIES_ARTIFACT_ID: + case CLOUD_RELEASE_ARTIFACT_ID: + case CLOUD_STARTER_ARTIFACT_ID: + case CLOUD_STARTER_PARENT_ARTIFACT_ID: + updateSpringCloudVersions(newProjects, version); + break; + } + return newProjects; + } + + private void updateBootVersions(Set newProjects, String version) { + remove(newProjects, SPRING_BOOT); + remove(newProjects, BOOT_STARTER_ARTIFACT_ID); + remove(newProjects, BOOT_STARTER_PARENT_ARTIFACT_ID); + remove(newProjects, BOOT_DEPENDENCIES_ARTIFACT_ID); + add(newProjects, SPRING_BOOT, version); + add(newProjects, BOOT_STARTER_ARTIFACT_ID, version); + add(newProjects, BOOT_STARTER_PARENT_ARTIFACT_ID, version); + add(newProjects, BOOT_DEPENDENCIES_ARTIFACT_ID, version); + } + + private void updateBuildVersions(Set newProjects, String version) { + remove(newProjects, BUILD_ARTIFACT_ID); + remove(newProjects, CLOUD_DEPENDENCIES_PARENT_ARTIFACT_ID); + add(newProjects, BUILD_ARTIFACT_ID, version); + add(newProjects, CLOUD_DEPENDENCIES_PARENT_ARTIFACT_ID, version); + } + + private void updateSpringCloudVersions(Set newProjects, String version) { + remove(newProjects, CLOUD_DEPENDENCIES_ARTIFACT_ID); + remove(newProjects, CLOUD_ARTIFACT_ID); + remove(newProjects, CLOUD_RELEASE_ARTIFACT_ID); + remove(newProjects, CLOUD_STARTER_ARTIFACT_ID); + remove(newProjects, CLOUD_STARTER_PARENT_ARTIFACT_ID); + add(newProjects, CLOUD_DEPENDENCIES_ARTIFACT_ID, version); + add(newProjects, CLOUD_ARTIFACT_ID, version); + add(newProjects, CLOUD_RELEASE_ARTIFACT_ID, version); + add(newProjects, CLOUD_STARTER_ARTIFACT_ID, version); + add(newProjects, CLOUD_STARTER_PARENT_ARTIFACT_ID, version); + } + + private void add(Set projects, String key, String value) { + projects.add(new Project(key, value)); + } + + private void remove(Set projects, String expectedProjectName) { + projects.removeIf(project -> expectedProjectName.equals(project.name)); + } + +} diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/cloud/docs/SpringCloudCustomProjectDocumentationUpdater.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/cloud/docs/SpringCloudCustomProjectDocumentationUpdater.java new file mode 100644 index 00000000..c764ffe2 --- /dev/null +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/cloud/docs/SpringCloudCustomProjectDocumentationUpdater.java @@ -0,0 +1,160 @@ +/* + * Copyright 2013-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.release.cloud.docs; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.cloud.release.internal.docs.CustomProjectDocumentationUpdater; +import org.springframework.cloud.release.internal.git.ProjectGitHandler; +import org.springframework.cloud.release.internal.project.ProjectVersion; + +/** + * @author Marcin Grzejszczak + */ +class SpringCloudCustomProjectDocumentationUpdater + implements CustomProjectDocumentationUpdater { + + private static final String HTTP_SC_STATIC_URL = "http://cloud.spring.io/spring-cloud-static/"; + + private static final String HTTPS_SC_STATIC_URL = "https://cloud.spring.io/spring-cloud-static/"; + + private static final Logger log = LoggerFactory + .getLogger(SpringCloudCustomProjectDocumentationUpdater.class); + + private final ProjectGitHandler gitHandler; + + SpringCloudCustomProjectDocumentationUpdater(ProjectGitHandler gitHandler) { + this.gitHandler = gitHandler; + } + + @Override + public boolean isApplicable(File clonedDocumentationProject, + ProjectVersion currentProject, String bomBranch) { + return clonedDocumentationProject.getName().startsWith("spring-cloud") + || currentProject.projectName.startsWith("spring-cloud"); + } + + /** + * Updates the documentation repository if current release train version is greater or + * equal than the one stored in the repo. + * @param currentProject project to update the docs repo for + * @param bomBranch the bom project branch + * @return {@link File cloned temporary directory} - {@code null} if wrong version is + * used + */ + @Override + public File updateDocsRepo(File clonedDocumentationProject, + ProjectVersion currentProject, String bomBranch) { + log.debug("Cloning the doc project to [{}]", clonedDocumentationProject); + String pathToIndexHtml = "current/index.html"; + File indexHtml = indexHtml(clonedDocumentationProject, pathToIndexHtml); + if (!indexHtml.exists()) { + throw new IllegalStateException( + "index.html is not present at [" + pathToIndexHtml + "]"); + } + return updateTheDocsRepo(bomBranch, clonedDocumentationProject, indexHtml); + } + + File indexHtml(File clonedDocumentationProject, String pathToIndexHtml) { + return new File(clonedDocumentationProject, pathToIndexHtml); + } + + private File updateTheDocsRepo(String springCloudReleaseBranch, + File documentationProject, File indexHtml) { + try { + String indexHtmlText = readIndexHtmlContents(indexHtml); + int httpIndex = indexHtmlText.indexOf(HTTP_SC_STATIC_URL); + int httpsIndex = indexHtmlText.indexOf(HTTPS_SC_STATIC_URL); + if (httpIndex == -1 && httpsIndex == -1) { + throw new IllegalStateException( + "The URL to the documentation repo not found in the index.html file"); + } + int beginIndex = beginIndex(httpIndex, httpsIndex); + String storedReleaseTrainLine = indexHtmlText.substring(beginIndex); + String storedReleaseTrain = storedReleaseTrainLine.substring(0, + storedReleaseTrainLine.indexOf("/")); + String firstLetterOfReleaseTrain = String + .valueOf(storedReleaseTrain.charAt(0)); + String currentReleaseTrainVersion = branchToReleaseVersion( + springCloudReleaseBranch); + String firstLetterOfCurrentReleaseTrain = String + .valueOf(currentReleaseTrainVersion.charAt(0)); + boolean newerOrEqualReleaseTrain = isNewerOrEqualReleaseTrain( + storedReleaseTrain, firstLetterOfReleaseTrain, + currentReleaseTrainVersion, firstLetterOfCurrentReleaseTrain); + if (!newerOrEqualReleaseTrain) { + log.info( + "Current release train [{}] is not newer than the stored one [{}]", + currentReleaseTrainVersion, storedReleaseTrain); + return documentationProject; + } + return pushCommitedChanges(currentReleaseTrainVersion, documentationProject, + indexHtml, indexHtmlText, storedReleaseTrain); + } + catch (IOException e) { + throw new IllegalStateException(e); + } + } + + boolean isNewerOrEqualReleaseTrain(String storedReleaseTrain, + String firstLetterOfReleaseTrain, String currentReleaseTrainVersion, + String firstLetterOfCurrentReleaseTrain) { + return (!storedReleaseTrain.equals(currentReleaseTrainVersion)) + && firstLetterOfCurrentReleaseTrain + .compareToIgnoreCase(firstLetterOfReleaseTrain) >= 0; + } + + private int beginIndex(int httpIndex, int httpsIndex) { + if (httpIndex != -1) { + return httpIndex + HTTP_SC_STATIC_URL.length(); + } + return httpsIndex + HTTPS_SC_STATIC_URL.length(); + } + + private String branchToReleaseVersion(String springCloudReleaseBranch) { + if (springCloudReleaseBranch.startsWith("v")) { + return springCloudReleaseBranch.substring(1); + } + return springCloudReleaseBranch; + } + + private File pushCommitedChanges(String currentReleaseTrainVersion, + File documentationProject, File indexHtml, String indexHtmlText, + String storedReleaseTrain) throws IOException { + String replacedIndexHtml = indexHtmlText.replace(storedReleaseTrain, + currentReleaseTrainVersion); + Files.write(indexHtml.toPath(), replacedIndexHtml.getBytes()); + log.info("Stored the release train [{}] in [{}]", currentReleaseTrainVersion, + indexHtml.getAbsolutePath()); + this.gitHandler.commit(documentationProject, + "Updating the link to the current version to [" + + currentReleaseTrainVersion + "]"); + this.gitHandler.pushCurrentBranch(documentationProject); + log.info("Committed and pushed changes to the documentation project"); + return documentationProject; + } + + String readIndexHtmlContents(File indexHtml) throws IOException { + return new String(Files.readAllBytes(indexHtml.toPath())); + } + +} diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/Releaser.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/Releaser.java index c9c4ab85..43cd075c 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/Releaser.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/Releaser.java @@ -22,15 +22,16 @@ import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.cloud.release.internal.buildsystem.GradleUpdater; +import org.springframework.cloud.release.internal.buildsystem.ProjectPomUpdater; import org.springframework.cloud.release.internal.docs.DocumentationUpdater; import org.springframework.cloud.release.internal.git.ProjectGitHandler; -import org.springframework.cloud.release.internal.gradle.GradleUpdater; -import org.springframework.cloud.release.internal.pom.ProcessedProject; -import org.springframework.cloud.release.internal.pom.ProjectPomUpdater; -import org.springframework.cloud.release.internal.pom.ProjectVersion; -import org.springframework.cloud.release.internal.pom.Projects; -import org.springframework.cloud.release.internal.post.PostReleaseActions; -import org.springframework.cloud.release.internal.project.ProjectBuilder; +import org.springframework.cloud.release.internal.github.ProjectGitHubHandler; +import org.springframework.cloud.release.internal.postrelease.PostReleaseActions; +import org.springframework.cloud.release.internal.project.ProcessedProject; +import org.springframework.cloud.release.internal.project.ProjectCommandExecutor; +import org.springframework.cloud.release.internal.project.ProjectVersion; +import org.springframework.cloud.release.internal.project.Projects; import org.springframework.cloud.release.internal.sagan.SaganUpdater; import org.springframework.cloud.release.internal.tech.MakeBuildUnstableException; import org.springframework.cloud.release.internal.template.TemplateGenerator; @@ -47,14 +48,14 @@ public class Releaser implements ReleaserPropertiesAware { private static boolean SKIP_SNAPSHOT_ASSERTION = false; - private ReleaserProperties releaserProperties; - private final ProjectPomUpdater projectPomUpdater; - private final ProjectBuilder projectBuilder; + private final ProjectCommandExecutor projectCommandExecutor; private final ProjectGitHandler projectGitHandler; + private final ProjectGitHubHandler projectGitHubHandler; + private final TemplateGenerator templateGenerator; private final GradleUpdater gradleUpdater; @@ -65,16 +66,21 @@ public class Releaser implements ReleaserPropertiesAware { private final PostReleaseActions postReleaseActions; + private ReleaserProperties releaserProperties; + public Releaser(ReleaserProperties releaserProperties, - ProjectPomUpdater projectPomUpdater, ProjectBuilder projectBuilder, - ProjectGitHandler projectGitHandler, TemplateGenerator templateGenerator, - GradleUpdater gradleUpdater, SaganUpdater saganUpdater, - DocumentationUpdater documentationUpdater, + ProjectPomUpdater projectPomUpdater, + ProjectCommandExecutor projectCommandExecutor, + ProjectGitHandler projectGitHandler, + ProjectGitHubHandler projectGitHubHandler, + TemplateGenerator templateGenerator, GradleUpdater gradleUpdater, + SaganUpdater saganUpdater, DocumentationUpdater documentationUpdater, PostReleaseActions postReleaseActions) { this.releaserProperties = releaserProperties; this.projectPomUpdater = projectPomUpdater; - this.projectBuilder = projectBuilder; + this.projectCommandExecutor = projectCommandExecutor; this.projectGitHandler = projectGitHandler; + this.projectGitHubHandler = projectGitHubHandler; this.templateGenerator = templateGenerator; this.gradleUpdater = gradleUpdater; this.saganUpdater = saganUpdater; @@ -86,7 +92,7 @@ public class Releaser implements ReleaserPropertiesAware { return this.projectGitHandler.cloneProjectFromOrg(projectName); } - public Projects retrieveVersionsFromSCRelease() { + public Projects retrieveVersionsFromBom() { return this.projectPomUpdater.retrieveVersionsFromReleaseTrainBom(); } @@ -110,7 +116,7 @@ public class Releaser implements ReleaserPropertiesAware { } public void buildProject(ProjectVersion versionFromScRelease) { - this.projectBuilder.build(versionFromScRelease); + this.projectCommandExecutor.build(versionFromScRelease); log.info("\nProject was successfully built"); } @@ -120,12 +126,12 @@ public class Releaser implements ReleaserPropertiesAware { } public void deploy(ProjectVersion versionFromScRelease) { - this.projectBuilder.deploy(versionFromScRelease); + this.projectCommandExecutor.deploy(versionFromScRelease); log.info("\nThe artifact was deployed successfully"); } public void publishDocs(ProjectVersion changedVersion) { - this.projectBuilder.publishDocs(changedVersion.version); + this.projectCommandExecutor.publishDocs(changedVersion.version); log.info("\nThe docs were published successfully"); } @@ -181,7 +187,7 @@ public class Releaser implements ReleaserPropertiesAware { return; } try { - this.projectGitHandler.closeMilestone(releaseVersion); + this.projectGitHubHandler.closeMilestone(releaseVersion); log.info("\nSuccessfully closed milestone"); } catch (Exception ex) { @@ -267,7 +273,7 @@ public class Releaser implements ReleaserPropertiesAware { private Exception createIssueInSpringGuides(ProjectVersion releaseVersion, Projects projects) { try { - this.projectGitHandler.createIssueInSpringGuides(projects, releaseVersion); + this.projectGitHubHandler.createIssueInSpringGuides(projects, releaseVersion); log.info("\nSuccessfully created an issue in Spring Guides"); return null; } @@ -281,7 +287,8 @@ public class Releaser implements ReleaserPropertiesAware { private Exception createIssueInStartSpringIo(ProjectVersion releaseVersion, Projects projects) { try { - this.projectGitHandler.createIssueInStartSpringIo(projects, releaseVersion); + this.projectGitHubHandler.createIssueInStartSpringIo(projects, + releaseVersion); log.info("\nSuccessfully created an issue in start.spring.io"); return null; } diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/ReleaserProperties.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/ReleaserProperties.java index f0389ae8..ef71a922 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/ReleaserProperties.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/ReleaserProperties.java @@ -23,6 +23,7 @@ import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.StringJoiner; import org.apache.commons.lang.SerializationUtils; @@ -55,6 +56,8 @@ public class ReleaserProperties implements Serializable { private Maven maven = new Maven(); + private Bash bash = new Bash(); + private Gradle gradle = new Gradle(); private Sagan sagan = new Sagan(); @@ -64,8 +67,8 @@ public class ReleaserProperties implements Serializable { private Versions versions = new Versions(); /** - * Project name to its version - overrides all versions retrieved from a repository - * like Spring Cloud Release. + * Project name to its version - overrides all versions retrieved from a release train + * repository like Spring Cloud Release. */ private Map fixedVersions = new LinkedHashMap<>(); @@ -112,6 +115,14 @@ public class ReleaserProperties implements Serializable { this.gradle = gradle; } + public Bash getBash() { + return bash; + } + + public void setBash(Bash bash) { + this.bash = bash; + } + public Map getFixedVersions() { return this.fixedVersions; } @@ -262,7 +273,7 @@ public class ReleaserProperties implements Serializable { public static class Git implements Serializable { /** - * URL to Spring Cloud Release Git repository. + * URL to a release train repository. */ private String releaseTrainBomUrl = "https://github.com/spring-cloud/spring-cloud-release"; @@ -272,7 +283,7 @@ public class ReleaserProperties implements Serializable { private String documentationUrl = "https://github.com/spring-cloud/spring-cloud-static"; /** - * URL to main release train project repository. + * URL to the release train project page repository. */ private String springProjectUrl = "https://github.com/spring-projects/spring-cloud"; @@ -318,8 +329,8 @@ public class ReleaserProperties implements Serializable { private String releaseTrainWikiPagePrefix = "Spring-Cloud"; /** - * Where should the Spring Cloud Release repo get cloned to. If {@code null} - * defaults to a temporary directory. + * Where should the release train repo get cloned to. If {@code null} defaults to + * a temporary directory. */ private String cloneDestinationDir; @@ -840,8 +851,128 @@ public class ReleaserProperties implements Serializable { } + public static class Bash implements Serializable { + + /** + * Placeholder for system properties. + */ + public static final String SYSTEM_PROPS_PLACEHOLDER = "{{systemProps}}"; + + /** + * Command to be executed to build the project. + */ + private String buildCommand = "echo \"{{systemProps}}\""; + + /** + * Command to be executed to deploy a built project. + */ + private String deployCommand = "echo \"{{systemProps}}\""; + + /** + * Command to be executed to build and deploy guides project only. + */ + private String deployGuidesCommand = "echo \"{{systemProps}}\""; + + /** + * Command to be executed to publish documentation. If present "{{version}}" will + * be replaced by the provided version. + */ + private String[] publishDocsCommands = { "mkdir -p target", + "echo \"{{version}}\"" }; + + /** + * Command to be executed to generate release train documentation. + */ + private String generateReleaseTrainDocsCommand = "echo \"{{version}}\""; + + /** + * Additional system properties that should be passed to the build / deploy + * commands. If present in other commands "{{systemProps}}" will be substituted + * with this property. + */ + private String systemProperties = ""; + + /** + * Max wait time in minutes for the process to finish. + */ + private long waitTimeInMinutes = 20; + + public String getBuildCommand() { + return this.buildCommand; + } + + public void setBuildCommand(String buildCommand) { + this.buildCommand = buildCommand; + } + + public long getWaitTimeInMinutes() { + return this.waitTimeInMinutes; + } + + public void setWaitTimeInMinutes(long waitTimeInMinutes) { + this.waitTimeInMinutes = waitTimeInMinutes; + } + + public String getDeployCommand() { + return this.deployCommand; + } + + public void setDeployCommand(String deployCommand) { + this.deployCommand = deployCommand; + } + + public String getDeployGuidesCommand() { + return this.deployGuidesCommand; + } + + public void setDeployGuidesCommand(String deployGuidesCommand) { + this.deployGuidesCommand = deployGuidesCommand; + } + + public String[] getPublishDocsCommands() { + return this.publishDocsCommands; + } + + public void setPublishDocsCommands(String[] publishDocsCommands) { + this.publishDocsCommands = publishDocsCommands; + } + + public String getGenerateReleaseTrainDocsCommand() { + return this.generateReleaseTrainDocsCommand; + } + + public void setGenerateReleaseTrainDocsCommand( + String generateReleaseTrainDocsCommand) { + this.generateReleaseTrainDocsCommand = generateReleaseTrainDocsCommand; + } + + public String getSystemProperties() { + return this.systemProperties; + } + + public void setSystemProperties(String systemProperties) { + this.systemProperties = systemProperties; + } + + @Override + public String toString() { + return "Maven{" + "buildCommand='" + this.buildCommand + '\'' + + ", deployCommand='" + this.deployCommand + '\'' + + ", publishDocsCommands=" + Arrays.toString(this.publishDocsCommands) + + "generateReleaseTrainDocsCommand='" + + this.generateReleaseTrainDocsCommand + '\'' + ", waitTimeInMinutes=" + + this.waitTimeInMinutes + '}'; + } + + } + public static class Gradle implements Serializable { + /** + * Placeholder for system properties. + */ + public static final String SYSTEM_PROPS_PLACEHOLDER = "{{systemProps}}"; + /** * A mapping that should be applied to {@code gradle.properties} in order to * perform a substitution of properties. The mapping is from a property inside @@ -872,6 +1003,101 @@ public class ReleaserProperties implements Serializable { "^.*spring-cloud-contract-maven-plugin/target/.*$", "^.*samples/standalone/[a-z]+/.*$"); + /** + * Command to be executed to build the project. + */ + private String buildCommand = "./gradlew clean build publishToMavenLocal {{systemProps}}"; + + /** + * Command to be executed to deploy a built project. + */ + private String deployCommand = "./gradlew clean build publish {{systemProps}}"; + + /** + * Command to be executed to build and deploy guides project only. + */ + private String deployGuidesCommand = "./gradlew clean build deployGuides {{systemProps}}"; + + /** + * Command to be executed to publish documentation. If present "{{version}}" will + * be replaced by the provided version. + */ + private String[] publishDocsCommands = { "echo 'TODO'" }; + + /** + * Command to be executed to generate release train documentation. + */ + private String generateReleaseTrainDocsCommand = "echo 'TODO'"; + + /** + * Additional system properties that should be passed to the build / deploy + * commands. If present in other commands "{{systemProps}}" will be substituted + * with this property. + */ + private String systemProperties = ""; + + /** + * Max wait time in minutes for the process to finish. + */ + private long waitTimeInMinutes = 20; + + public String getBuildCommand() { + return this.buildCommand; + } + + public void setBuildCommand(String buildCommand) { + this.buildCommand = buildCommand; + } + + public long getWaitTimeInMinutes() { + return this.waitTimeInMinutes; + } + + public void setWaitTimeInMinutes(long waitTimeInMinutes) { + this.waitTimeInMinutes = waitTimeInMinutes; + } + + public String getDeployCommand() { + return this.deployCommand; + } + + public void setDeployCommand(String deployCommand) { + this.deployCommand = deployCommand; + } + + public String getDeployGuidesCommand() { + return this.deployGuidesCommand; + } + + public void setDeployGuidesCommand(String deployGuidesCommand) { + this.deployGuidesCommand = deployGuidesCommand; + } + + public String[] getPublishDocsCommands() { + return this.publishDocsCommands; + } + + public void setPublishDocsCommands(String[] publishDocsCommands) { + this.publishDocsCommands = publishDocsCommands; + } + + public String getGenerateReleaseTrainDocsCommand() { + return this.generateReleaseTrainDocsCommand; + } + + public void setGenerateReleaseTrainDocsCommand( + String generateReleaseTrainDocsCommand) { + this.generateReleaseTrainDocsCommand = generateReleaseTrainDocsCommand; + } + + public String getSystemProperties() { + return this.systemProperties; + } + + public void setSystemProperties(String systemProperties) { + this.systemProperties = systemProperties; + } + public Map getGradlePropsSubstitution() { return this.gradlePropsSubstitution; } @@ -891,8 +1117,17 @@ public class ReleaserProperties implements Serializable { @Override public String toString() { - return "Gradle{" + "gradlePropsSubstitution=" + this.gradlePropsSubstitution - + ", ignoredGradleRegex=" + this.ignoredGradleRegex + '}'; + return new StringJoiner(", ", Gradle.class.getSimpleName() + "[", "]") + .add("gradlePropsSubstitution=" + gradlePropsSubstitution) + .add("ignoredGradleRegex=" + ignoredGradleRegex) + .add("buildCommand='" + buildCommand + "'") + .add("deployCommand='" + deployCommand + "'") + .add("deployGuidesCommand='" + deployGuidesCommand + "'") + .add("publishDocsCommands=" + Arrays.toString(publishDocsCommands)) + .add("generateReleaseTrainDocsCommand='" + + generateReleaseTrainDocsCommand + "'") + .add("systemProperties='" + systemProperties + "'") + .add("waitTimeInMinutes=" + waitTimeInMinutes).toString(); } } diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/BomParser.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/BomParser.java new file mode 100644 index 00000000..d907f07f --- /dev/null +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/BomParser.java @@ -0,0 +1,44 @@ +/* + * Copyright 2013-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.release.internal.buildsystem; + +import java.io.File; +import java.util.List; + +/** + * Parses the bom and returns all parsed versions. + */ +public interface BomParser { + + /** + * @param clonedBom - location of the cloned BOM repository + * @return {@code true} - when this BOM parser can be applied + */ + boolean isApplicable(File clonedBom); + + /** + * @param thisProjectRoot - root of the clone project + * @return versions from BOM + */ + VersionsFromBom versionsFromBom(File thisProjectRoot); + + /** + * @return a list of available custom bom parsers + */ + List customBomParsers(); + +} diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/CompositeBomParser.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/CompositeBomParser.java new file mode 100644 index 00000000..78786326 --- /dev/null +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/CompositeBomParser.java @@ -0,0 +1,53 @@ +/* + * Copyright 2013-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.release.internal.buildsystem; + +import java.io.File; +import java.util.List; +import java.util.stream.Collectors; + +class CompositeBomParser implements BomParser { + + private final List parsers; + + CompositeBomParser(List parsers) { + this.parsers = parsers; + } + + @Override + public boolean isApplicable(File clonedBom) { + return this.parsers.stream().anyMatch(b -> b.isApplicable(clonedBom)); + } + + @Override + public VersionsFromBom versionsFromBom(File thisProjectRoot) { + return firstMatching(thisProjectRoot).versionsFromBom(thisProjectRoot); + } + + private BomParser firstMatching(File thisProjectRoot) { + return this.parsers.stream().filter(b -> b.isApplicable(thisProjectRoot)) + .findFirst().orElseThrow( + () -> new IllegalStateException("Can't find a matching parser")); + } + + @Override + public List customBomParsers() { + return this.parsers.stream().flatMap(b -> b.customBomParsers().stream()) + .collect(Collectors.toList()); + } + +} diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/CustomBomParser.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/CustomBomParser.java new file mode 100644 index 00000000..3ba01489 --- /dev/null +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/CustomBomParser.java @@ -0,0 +1,88 @@ +/* + * Copyright 2013-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.release.internal.buildsystem; + +import java.io.File; +import java.util.LinkedHashSet; +import java.util.Set; + +import org.springframework.cloud.release.internal.ReleaserProperties; +import org.springframework.cloud.release.internal.project.Project; +import org.springframework.lang.Nullable; + +/** + * Allows to pass in some additional gradle files parser. + */ +public interface CustomBomParser { + + CustomBomParser NO_OP = new CustomBomParser() { + @Override + public boolean isApplicable(File thisProjectRoot, ReleaserProperties properties, + Set projects) { + return true; + } + + @Override + public VersionsFromBom parseBom(File thisProjectRoot, + ReleaserProperties properties) { + return VersionsFromBom.EMPTY_VERSION; + } + + }; + + /** + * Different projects can have different parsers. This method will tell whether the + * current parser should be applied or not. + * @param thisProjectRoot - location of the cloned project + * @param properties - releaser properties + * @param projects - parsed projects from the BOM + * @return {@code true} if the parser should be applied. + */ + boolean isApplicable(File thisProjectRoot, ReleaserProperties properties, + @Nullable Set projects); + + /** + * When parsing a part of the BOM pom, one can add custom logic to perform project + * specific parsing. + * @param thisProjectRoot - location of the cloned project + * @param properties - releaser properties + * @return - versions retrieved from the BOM. Can be + * {@link VersionsFromBom#EMPTY_VERSION} if nothing was found. + */ + VersionsFromBom parseBom(File thisProjectRoot, ReleaserProperties properties); + + /** + * Allows to hook in custom logic for versions setting. + * @param projects - set of projects + * @param projectName - name of the project + * @param version - version of the project + * @return - a new collection with the modified versions from bom + */ + default Set setVersion(Set projects, String projectName, + String version) { + return new LinkedHashSet<>(projects); + } + + default boolean isMaven(File thisProjectRoot) { + return new File(thisProjectRoot, "pom.xml").exists(); + } + + default boolean isGradle(File thisProjectRoot) { + return new File(thisProjectRoot, "build.gradle").exists(); + } + +} diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/GradleBomParser.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/GradleBomParser.java new file mode 100644 index 00000000..deb4945f --- /dev/null +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/GradleBomParser.java @@ -0,0 +1,105 @@ +/* + * Copyright 2013-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.release.internal.buildsystem; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.springframework.cloud.release.internal.ReleaserProperties; + +class GradleBomParser implements BomParser { + + private static final Pattern VERSION_PATTERN = Pattern + .compile("^([a-zA-Z0-9]+)Version$"); + + private final ReleaserProperties properties; + + private final List customParsers; + + GradleBomParser(ReleaserProperties releaserProperties, + List customParsers) { + this.properties = releaserProperties; + this.customParsers = customParsers; + } + + @Override + public boolean isApplicable(File clonedBom) { + return file(clonedBom, "build.gradle").exists(); + } + + File file(File clonedBom, String child) { + return new File(clonedBom, child); + } + + @Override + public VersionsFromBom versionsFromBom(File thisProjectRoot) { + File gradleProperties = file(thisProjectRoot, "gradle.properties"); + if (!gradleProperties.exists()) { + return VersionsFromBom.EMPTY_VERSION; + } + Properties properties = loadProps(gradleProperties); + final Map substitution = this.properties.getGradle() + .getGradlePropsSubstitution(); + VersionsFromBom versionsFromBom = new VersionsFromBomBuilder() + .thisProjectRoot(thisProjectRoot).releaserProperties(this.properties) + .parsers(this.customParsers).retrieveFromBom(); + properties.forEach((key, value) -> { + String projectName = projectName(substitution, key); + versionsFromBom.setVersion(projectName, value.toString()); + }); + return versionsFromBom; + } + + private String projectName(Map substitution, Object key) { + String projectName = key.toString(); + if (substitution.containsKey(key)) { + projectName = substitution.get(key); + } + else { + Matcher matcher = VERSION_PATTERN.matcher(projectName); + boolean versionMatches = matcher.matches(); + if (versionMatches) { + projectName = matcher.group(1); + } + } + projectName = projectName.replaceAll("([A-Z])", "-$1").toLowerCase(); + return projectName; + } + + Properties loadProps(File file) { + Properties props = new Properties(); + try { + props.load(new FileInputStream(file)); + } + catch (IOException e) { + throw new IllegalStateException(e); + } + return props; + } + + @Override + public List customBomParsers() { + return this.customParsers; + } + +} diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/gradle/GradleUpdater.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/GradleUpdater.java similarity index 95% rename from spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/gradle/GradleUpdater.java rename to spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/GradleUpdater.java index 6b0bfe5a..986ebfd1 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/gradle/GradleUpdater.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/GradleUpdater.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.release.internal.gradle; +package org.springframework.cloud.release.internal.buildsystem; import java.io.File; import java.io.FileInputStream; @@ -37,8 +37,8 @@ import org.slf4j.LoggerFactory; import org.springframework.cloud.release.internal.ReleaserProperties; import org.springframework.cloud.release.internal.ReleaserPropertiesAware; -import org.springframework.cloud.release.internal.pom.ProjectVersion; -import org.springframework.cloud.release.internal.pom.Projects; +import org.springframework.cloud.release.internal.project.ProjectVersion; +import org.springframework.cloud.release.internal.project.Projects; /** * @author Marcin Grzejszczak @@ -69,10 +69,10 @@ public class GradleUpdater implements ReleaserPropertiesAware { } private void processAllGradleProps(File projectRoot, Projects projects, - ProjectVersion versionFromScRelease, boolean assertVersions) { + ProjectVersion versionFromBom, boolean assertVersions) { try { Files.walkFileTree(projectRoot.toPath(), new GradlePropertiesWalker( - this.properties, projects, versionFromScRelease, assertVersions)); + this.properties, projects, versionFromBom, assertVersions)); } catch (IOException e) { throw new IllegalStateException(e); @@ -175,6 +175,12 @@ public class GradleUpdater implements ReleaserPropertiesAware { } } + private boolean pathIgnored(File file) { + String path = file.getPath(); + return this.assertVersions && this.properties.getGradle() + .getIgnoredGradleRegex().stream().anyMatch(path::matches); + } + private Properties loadProps(File file) { Properties props = new Properties(); try { @@ -186,12 +192,6 @@ public class GradleUpdater implements ReleaserPropertiesAware { return props; } - private boolean pathIgnored(File file) { - String path = file.getPath(); - return this.assertVersions && this.properties.getGradle() - .getIgnoredGradleRegex().stream().anyMatch(path::matches); - } - private String asString(Path path) { try { return new String(Files.readAllBytes(path)); diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/MavenBomParser.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/MavenBomParser.java new file mode 100644 index 00000000..25ec023e --- /dev/null +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/MavenBomParser.java @@ -0,0 +1,110 @@ +/* + * Copyright 2013-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.release.internal.buildsystem; + +import java.io.File; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import org.apache.maven.model.Model; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.cloud.release.internal.ReleaserProperties; +import org.springframework.cloud.release.internal.project.Project; +import org.springframework.cloud.release.internal.tech.PomReader; + +/** + * Parses the poms for a given project and populates versions from a release train. + * + * @author Marcin Grzejszczak + */ +class MavenBomParser implements BomParser { + + private static final Logger log = LoggerFactory.getLogger(MavenBomParser.class); + + private final String thisTrainBomLocation; + + private final Pattern versionPattern; + + private final ReleaserProperties properties; + + private final List customParsers; + + MavenBomParser(ReleaserProperties properties, List customParsers) { + this.thisTrainBomLocation = properties.getPom().getThisTrainBom(); + this.versionPattern = Pattern.compile(properties.getPom().getBomVersionPattern()); + this.properties = properties; + this.customParsers = customParsers; + } + + @Override + public boolean isApplicable(File clonedBom) { + return new File(clonedBom, "pom.xml").exists(); + } + + // the BOM contains all versions of projects and its parent MUST be Spring Cloud + // Dependencies Parent + @Override + public VersionsFromBom versionsFromBom(File thisProjectRoot) { + Model model = PomReader.pom(thisProjectRoot, this.thisTrainBomLocation); + if (model == null) { + return VersionsFromBom.EMPTY_VERSION; + } + Set projects = model.getProperties().entrySet().stream() + .filter(propertyMatchesVersionPattern()).map(toProject()) + .collect(Collectors.toSet()); + String releaseTrainProjectVersion = model.getVersion(); + projects.add( + new Project(this.properties.getMetaRelease().getReleaseTrainProjectName(), + releaseTrainProjectVersion)); + // @formatter:off + return new VersionsFromBomBuilder() + .thisProjectRoot(thisProjectRoot) + .releaserProperties(this.properties) + .parsers(this.customParsers) + .projects(projects) + .retrieveFromBom(); + // @formatter:on + } + + private Predicate> propertyMatchesVersionPattern() { + return entry -> this.versionPattern.matcher(entry.getKey().toString()).matches(); + } + + private Function, Project> toProject() { + return entry -> { + Matcher matcher = this.versionPattern.matcher(entry.getKey().toString()); + // you have to first match to get info about the group + matcher.matches(); + String name = matcher.group(1); + return new Project(name, entry.getValue().toString()); + }; + } + + @Override + public List customBomParsers() { + return this.customParsers; + } + +} diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/PomUpdater.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/PomUpdater.java similarity index 84% rename from spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/PomUpdater.java rename to spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/PomUpdater.java index df4d7797..a44d21f4 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/PomUpdater.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/PomUpdater.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.release.internal.pom; +package org.springframework.cloud.release.internal.buildsystem; import java.io.BufferedWriter; import java.io.File; @@ -40,6 +40,8 @@ import org.codehaus.stax2.XMLInputFactory2; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.cloud.release.internal.project.Project; +import org.springframework.cloud.release.internal.tech.PomReader; import org.springframework.util.StringUtils; import static org.springframework.util.StringUtils.hasText; @@ -52,29 +54,27 @@ class PomUpdater { private static final Logger log = LoggerFactory.getLogger(PomUpdater.class); - private final PomReader pomReader = new PomReader(); - private final PomWriter pomWriter = new PomWriter(); /** * Basing on the contents of the root pom and the versions will decide whether the * project should be updated or not. * @param rootFolder - root folder of the project - * @param versions - list of dependencies to be updated + * @param versionsFromBom - list of dependencies to be updated * @return {@code true} if the project is on the list of projects to be updated */ - boolean shouldProjectBeUpdated(File rootFolder, Versions versions) { + boolean shouldProjectBeUpdated(File rootFolder, VersionsFromBom versionsFromBom) { File rootPom = rootPom(rootFolder); if (!rootPom.exists()) { return false; } - Model model = this.pomReader.readPom(rootPom); + Model model = PomReader.readPom(rootPom); if (model == null) { log.info("Failed to read the model"); return false; } String artifactId = artifactId(model); - if (!versions.shouldBeUpdated(artifactId)) { + if (!versionsFromBom.shouldBeUpdated(artifactId)) { log.info( "Skipping project [{}] since it's not on the list of projects to update", model.getArtifactId()); @@ -136,22 +136,25 @@ class PomUpdater { } ModelWrapper readModel(File pom) { - return new ModelWrapper(this.pomReader.readPom(pom)); + return new ModelWrapper(PomReader.readPom(pom), pom); } /** * Updates the root / child module model. * @param rootPom - root project model * @param pom - file with the pom - * @param versions - versions to update + * @param versionsFromBom - versions to update * @return updated model */ - ModelWrapper updateModel(ModelWrapper rootPom, File pom, Versions versions) { - Model model = this.pomReader.readPom(pom); + ModelWrapper updateModel(ModelWrapper rootPom, File pom, + VersionsFromBom versionsFromBom) { + Model model = PomReader.readPom(pom); List sourceChanges = new ArrayList<>(); - sourceChanges = updateParentIfPossible(rootPom, versions, model, sourceChanges); - sourceChanges = updateVersionIfPossible(rootPom, versions, model, sourceChanges); - return new ModelWrapper(model, sourceChanges, versions); + sourceChanges = updateParentIfPossible(rootPom, versionsFromBom, model, + sourceChanges); + sourceChanges = updateVersionIfPossible(rootPom, versionsFromBom, model, + sourceChanges); + return new ModelWrapper(model, sourceChanges, versionsFromBom, pom); } /** @@ -159,17 +162,19 @@ class PomUpdater { * changes in the model. * @return - the pom file */ - File overwritePomIfDirty(ModelWrapper updatedPomModel, Versions versions, File pom) { + File overwritePomIfDirty(ModelWrapper updatedPomModel, + VersionsFromBom versionsFromBom, File pom) { if (updatedPomModel.isDirty()) { log.debug("There were changes in the pom so file will be overridden"); - this.pomWriter.write(updatedPomModel, versions, pom); + this.pomWriter.write(updatedPomModel, versionsFromBom, pom); log.info("Successfully stored [{}]", pom); } return pom; } private List updateParentIfPossible(ModelWrapper wrapper, - Versions versions, Model model, List sourceChanges) { + VersionsFromBom versionsFromBom, Model model, + List sourceChanges) { String rootProjectName = wrapper.projectName(); List changes = new ArrayList<>(sourceChanges); if (model.getParent() == null || isEmpty(model.getParent().getVersion())) { @@ -181,11 +186,11 @@ class PomUpdater { log.debug("Searching for a version of parent [{}:{}]", parentGroupId, parentArtifactId); String oldVersion = model.getParent().getVersion(); - String version = versions.versionForProject(parentArtifactId); + String version = versionsFromBom.versionForProject(parentArtifactId); log.debug("Found version is [{}]", version); if (isEmpty(version)) { if (hasText(model.getParent().getRelativePath())) { - version = versions.versionForProject(rootProjectName); + version = versionsFromBom.versionForProject(rootProjectName); } else { log.warn("There is no info on the [{}:{}] version", parentGroupId, @@ -209,7 +214,8 @@ class PomUpdater { } private List updateVersionIfPossible(ModelWrapper wrapper, - Versions versions, Model model, List sourceChanges) { + VersionsFromBom versionsFromBom, Model model, + List sourceChanges) { String rootProjectName = wrapper.projectName(); String rootProjectGroupId = wrapper.groupId(); List changes = new ArrayList<>(sourceChanges); @@ -224,7 +230,7 @@ class PomUpdater { } log.debug("Searching for a version [{}:{}]", groupId, artifactId); String oldVersion = model.getVersion(); - String version = versions.versionForProject(rootProjectName); + String version = versionsFromBom.versionForProject(rootProjectName); log.debug("Found version is [{}]", version); if (isEmpty(version) || isEmpty(model.getVersion())) { log.debug( @@ -259,19 +265,30 @@ class ModelWrapper { final Model model; - final Versions versions; + final VersionsFromBom versionsFromBom; final List sourceChanges = new ArrayList<>(); - ModelWrapper(Model model, List sourceChanges, Versions versions) { + final File rootFile; + + ModelWrapper(Model model, List sourceChanges, + VersionsFromBom versionsFromBom, File rootFile) { this.model = model; - this.versions = versions; + this.versionsFromBom = versionsFromBom; this.sourceChanges.addAll(sourceChanges); + this.rootFile = rootFile; + } + + ModelWrapper(Model model, File rootFile) { + this.model = model; + this.versionsFromBom = VersionsFromBom.EMPTY_VERSION; + this.rootFile = rootFile; } ModelWrapper(Model model) { this.model = model; - this.versions = Versions.EMPTY_VERSION; + this.versionsFromBom = VersionsFromBom.EMPTY_VERSION; + this.rootFile = null; } String projectName() { @@ -287,7 +304,7 @@ class ModelWrapper { boolean isDirty() { return !this.sourceChanges.isEmpty() - || this.versions.shouldSetProperty(this.model.getProperties()); + || this.versionsFromBom.shouldSetProperty(this.model.getProperties()); } } @@ -296,7 +313,7 @@ class PomWriter { private static final Logger log = LoggerFactory.getLogger(PomWriter.class); - void write(ModelWrapper wrapper, Versions versions, File pom) { + void write(ModelWrapper wrapper, VersionsFromBom versionsFromBom, File pom) { try { VersionChangerFactory versionChangerFactory = new VersionChangerFactory(); StringBuilder input = PomHelper.readXmlFile(pom); @@ -314,8 +331,8 @@ class PomWriter { changer.apply(versionChange); } log.debug("Applying properties changes to the pom [{}]", pom); - new PropertyVersionChanger(wrapper, versions, parsedPom, loggerToMavenLog) - .apply(null); + new PropertyVersionChanger(wrapper, versionsFromBom, parsedPom, + loggerToMavenLog).apply(null); try (BufferedWriter bw = new BufferedWriter(new FileWriter(pom))) { bw.write(input.toString()); } @@ -349,27 +366,27 @@ class PomWriter { class PropertyVersionChanger extends AbstractVersionChanger { - private final Versions versions; + private final VersionsFromBom versionsFromBom; private final PropertyStorer propertyStorer; - PropertyVersionChanger(ModelWrapper wrapper, Versions versions, + PropertyVersionChanger(ModelWrapper wrapper, VersionsFromBom versionsFromBom, ModifiedPomXMLEventReader pom, Log log) { super(wrapper.model, pom, log); - this.versions = versions; + this.versionsFromBom = versionsFromBom; this.propertyStorer = new PropertyStorer(log, pom); } - PropertyVersionChanger(ModelWrapper wrapper, Versions versions, + PropertyVersionChanger(ModelWrapper wrapper, VersionsFromBom versionsFromBom, ModifiedPomXMLEventReader pom, Log log, PropertyStorer propertyStorer) { super(wrapper.model, pom, log); - this.versions = versions; + this.versionsFromBom = versionsFromBom; this.propertyStorer = propertyStorer; } @Override public void apply(final VersionChange versionChange) { - this.versions.projects.stream().filter(project -> { + this.versionsFromBom.projects.stream().filter(project -> { Properties properties = getModel().getProperties(); String projectVersionKey = propertyName(project); if (!properties.containsKey(projectVersionKey)) { diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/ProjectPomUpdater.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/ProjectPomUpdater.java similarity index 75% rename from spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/ProjectPomUpdater.java rename to spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/ProjectPomUpdater.java index 83190709..bdf607c0 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/ProjectPomUpdater.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/ProjectPomUpdater.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.release.internal.pom; +package org.springframework.cloud.release.internal.buildsystem; import java.io.File; import java.io.IOException; @@ -38,6 +38,9 @@ import org.slf4j.LoggerFactory; import org.springframework.cloud.release.internal.ReleaserProperties; import org.springframework.cloud.release.internal.ReleaserPropertiesAware; import org.springframework.cloud.release.internal.git.ProjectGitHandler; +import org.springframework.cloud.release.internal.project.Project; +import org.springframework.cloud.release.internal.project.ProjectVersion; +import org.springframework.cloud.release.internal.project.Projects; /** * @author Marcin Grzejszczak @@ -53,22 +56,20 @@ public class ProjectPomUpdater implements ReleaserPropertiesAware { private static final boolean UPDATE_FIXED_VERSIONS = true; - private static final Map CACHE = new ConcurrentHashMap<>(); + private static final Map CACHE = new ConcurrentHashMap<>(); private final ProjectGitHandler gitRepo; private final PomUpdater pomUpdater = new PomUpdater(); + private final List bomParsers; + private ReleaserProperties properties; - public ProjectPomUpdater(ReleaserProperties properties) { + public ProjectPomUpdater(ReleaserProperties properties, List bomParsers) { this.properties = properties; this.gitRepo = new ProjectGitHandler(properties); - } - - ProjectPomUpdater(ReleaserProperties properties, ProjectGitHandler gitRepo) { - this.properties = properties; - this.gitRepo = gitRepo; + this.bomParsers = bomParsers; } /** @@ -92,34 +93,41 @@ public class ProjectPomUpdater implements ReleaserPropertiesAware { // TODO: I don't like this flag but don't have a better idea public Projects retrieveVersionsFromReleaseTrainBom(String branch, boolean updateFixedVersions) { - Versions versions = CACHE.computeIfAbsent(branch, s -> { - File clonedScRelease = this.gitRepo.cloneReleaseTrainProject(); - this.gitRepo.checkout(clonedScRelease, branch); - BomParser sCReleasePomParser = new BomParser(this.properties, - clonedScRelease); - return sCReleasePomParser.allVersions(); - }); + VersionsFromBom versionsFromBom = cachedVersionFromBom(branch); if (updateFixedVersions) { log.info("Will update the following versions manually [{}]", this.properties.getFixedVersions()); - this.properties.getFixedVersions().forEach(versions::setVersion); + this.properties.getFixedVersions().forEach(versionsFromBom::setVersion); } - log.info("Retrieved the following versions\n{}", versions); - return versions.toProjectVersions(); + log.info("Retrieved the following versions\n{}", versionsFromBom); + return versionsFromBom.toProjectVersions(); + } + + private VersionsFromBom cachedVersionFromBom(String branch) { + return CACHE.computeIfAbsent(branch, s -> { + File clonedBom = this.gitRepo.cloneReleaseTrainProject(); + this.gitRepo.checkout(clonedBom, branch); + return compositeBomParser().versionsFromBom(clonedBom); + }); + } + + private CompositeBomParser compositeBomParser() { + return new CompositeBomParser(this.bomParsers); } /** * @return map of fixed versions */ public Projects fixedVersions() { - Set projectVersions = this.properties.getFixedVersions() - .entrySet().stream() - .map(entry -> new ProjectVersion(entry.getKey(), entry.getValue())) + Set projects = this.properties.getFixedVersions().entrySet().stream() + .map(entry -> new Project(entry.getKey(), entry.getValue())) .collect(Collectors.toSet()); if (log.isDebugEnabled()) { - log.debug("Will apply the following fixed versions {}", projectVersions); + log.debug("Will apply the following fixed versions {}", projects); } - return new Versions(projectVersions, this.properties).toProjectVersions(); + return new VersionsFromBomBuilder().releaserProperties(this.properties) + .parsers(compositeBomParser().customBomParsers()).projects(projects) + .merged().toProjectVersions(); } /** @@ -134,15 +142,17 @@ public class ProjectPomUpdater implements ReleaserPropertiesAware { */ public void updateProjectFromReleaseTrain(File projectRoot, Projects projects, ProjectVersion versionFromReleaseTrain, boolean assertVersions) { - Versions versions = new Versions(projects, this.properties); - if (!this.pomUpdater.shouldProjectBeUpdated(projectRoot, versions)) { + VersionsFromBom versionsFromBom = new VersionsFromBomBuilder() + .thisProjectRoot(projectRoot).releaserProperties(this.properties) + .projects(projects.asProjects()).merged(); + if (!this.pomUpdater.shouldProjectBeUpdated(projectRoot, versionsFromBom)) { log.info("Skipping project updating"); return; } - updatePoms(projectRoot, projects, versionFromReleaseTrain, assertVersions); + updatePoms(projectRoot, versionsFromBom, versionFromReleaseTrain, assertVersions); } - private void updatePoms(File projectRoot, Projects projects, + private void updatePoms(File projectRoot, VersionsFromBom projects, ProjectVersion versionFromScRelease, boolean assertVersions) { File rootPom = new File(projectRoot, "pom.xml"); if (!rootPom.exists()) { @@ -174,7 +184,7 @@ public class ProjectPomUpdater implements ReleaserPropertiesAware { private final ModelWrapper rootPom; - private final Versions versions; + private final VersionsFromBom versionsFromBom; private final PomUpdater pomUpdater; @@ -186,11 +196,11 @@ public class ProjectPomUpdater implements ReleaserPropertiesAware { private final List unacceptableVersionPatterns; - private PomWalker(ModelWrapper rootPom, Projects projects, PomUpdater pomUpdater, - ReleaserProperties properties, ProjectVersion versionFromScRelease, - boolean assertVersions) { + private PomWalker(ModelWrapper rootPom, VersionsFromBom projects, + PomUpdater pomUpdater, ReleaserProperties properties, + ProjectVersion versionFromScRelease, boolean assertVersions) { this.rootPom = rootPom; - this.versions = new Versions(projects, properties); + this.versionsFromBom = projects; this.pomUpdater = pomUpdater; this.properties = properties; List unacceptableVersionPatterns = versionFromScRelease @@ -212,13 +222,14 @@ public class ProjectPomUpdater implements ReleaserPropertiesAware { return FileVisitResult.CONTINUE; } ModelWrapper model = this.pomUpdater.updateModel(this.rootPom, file, - this.versions); - this.pomUpdater.overwritePomIfDirty(model, this.versions, file); + this.versionsFromBom); + this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, file); if (this.assertVersions && !this.skipVersionAssert && !this.pomUpdater.hasSkipDeployment(model.model)) { log.debug( "Update is a non-snapshot one. Checking if no snapshot versions remained in the pom"); - Scanner scanner = new Scanner(asString(path)); + String text = asString(path); + Scanner scanner = new Scanner(text); int lineNumber = 0; while (scanner.hasNextLine()) { String line = scanner.nextLine(); @@ -230,6 +241,9 @@ public class ProjectPomUpdater implements ReleaserPropertiesAware { && pattern.matcher(line).matches()) .findFirst().orElse(null); if (matchingPattern != null) { + if (log.isDebugEnabled()) { + log.debug("File text \n" + text); + } throw new IllegalStateException("The file [" + path + "] matches the [ " + matchingPattern.pattern() + "] pattern in line number [" + lineNumber + "]\n\n" diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/VersionsFromBom.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/VersionsFromBom.java new file mode 100644 index 00000000..1fccac33 --- /dev/null +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/VersionsFromBom.java @@ -0,0 +1,189 @@ +/* + * Copyright 2013-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.release.internal.buildsystem; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Properties; +import java.util.Set; +import java.util.stream.Collectors; + +import org.springframework.cloud.release.internal.ReleaserProperties; +import org.springframework.cloud.release.internal.project.Project; +import org.springframework.cloud.release.internal.project.ProjectVersion; +import org.springframework.cloud.release.internal.project.Projects; + +/** + * Represents versions taken out from a release train POM. + * + * @author Marcin Grzejszczak + */ +public class VersionsFromBom { + + public static final VersionsFromBom EMPTY_VERSION = new VersionsFromBom(); + + Set projects = new HashSet<>(); + + ReleaserProperties properties; + + CustomBomParser parser; + + private VersionsFromBom() { + this.properties = new ReleaserProperties(); + } + + VersionsFromBom(ReleaserProperties releaserProperties, CustomBomParser parser) { + this.properties = releaserProperties; + this.parser = parser; + } + + VersionsFromBom(ReleaserProperties releaserProperties, CustomBomParser parser, + Set projects) { + this.properties = releaserProperties; + this.parser = parser; + projects.forEach(project -> setVersion(project.name, project.version)); + } + + VersionsFromBom(ReleaserProperties releaserProperties, CustomBomParser parser, + VersionsFromBom... projects) { + this.properties = releaserProperties; + this.parser = parser; + Arrays.stream(projects).forEach(p -> this.projects.addAll(p.projects)); + } + + private String bomProjectName() { + return this.properties.getMetaRelease().getReleaseTrainProjectName(); + } + + private String dependenciesArtifactId() { + String artifactId = this.properties.getPom().getThisTrainBom(); + return artifactId.split(File.separator)[0]; + } + + private String dependenciesParentArtifactId() { + return dependenciesArtifactId() + "-parent"; + } + + public String versionForProject(String projectName) { + return this.projects.stream().filter(project -> nameMatches(projectName, project)) + .findFirst().orElse(Project.EMPTY_PROJECT).version; + } + + public boolean shouldBeUpdated(String projectName) { + return this.projects.stream() + .anyMatch(project -> nameMatches(projectName, project)); + } + + public boolean shouldSetProperty(Properties properties) { + return this.projects.stream() + .anyMatch(project -> properties.containsKey(project.name + ".version")); + } + + public Projects toProjectVersions() { + return this.projects.stream() + .map(project -> new ProjectVersion(project.name, project.version)) + .collect(Collectors.toCollection(Projects::new)); + } + + /** + * The only exception is spring-cloud-dependencies (e.g. Greenwich.RELEASE) and + * spring-cloud-dependencies-parent (e.g. 2.1.0.RELEASE) + */ + private boolean nameMatches(String projectName, Project project) { + if (project.name.equals(projectName)) { + return true; + } + boolean parent = matchesNameWithSuffix(projectName, "-parent", project); + boolean bomArtifactId = comparisonOfBomArtifactAndParent(projectName, project); + return !bomArtifactId && (parent + || matchesNameWithSuffix(projectName, "-dependencies", project)); + } + + private boolean comparisonOfBomArtifactAndParent(String projectName, + Project project) { + return artifactOrParent(projectName, project.name) + || artifactOrParent(project.name, projectName); + } + + private boolean artifactOrParent(String projectName, String otherProjectName) { + return projectName.equals(dependenciesArtifactId()) + && otherProjectName.equals(dependenciesParentArtifactId()); + } + + private boolean matchesNameWithSuffix(String projectName, String suffix, + Project project) { + boolean containsSuffix = projectName.endsWith(suffix); + if (!containsSuffix) { + return false; + } + String withoutSuffix = projectName.substring(0, projectName.indexOf(suffix)); + return project.name.equals(withoutSuffix); + } + + public VersionsFromBom setVersion(String projectName, String version) { + Set projects = parser.setVersion(this.projects, projectName, version); + if (!projects.equals(this.projects)) { + this.projects.clear(); + this.projects.addAll(projects); + return this; + } + if (bomVersionProjectNames().contains(projectName)) { + updateBomVersions(version); + } + else { + remove(projectName); + add(projectName, version); + } + return this; + } + + private List bomVersionProjectNames() { + List names = new ArrayList<>( + this.properties.getMetaRelease().getReleaseTrainDependencyNames()); + names.add(this.properties.getMetaRelease().getReleaseTrainProjectName()); + return names; + } + + private void updateBomVersions(String version) { + remove(bomProjectName()); + bomVersionProjectNames().forEach(this::remove); + add(bomProjectName(), version); + bomVersionProjectNames().forEach(s -> add(s, version)); + } + + public void add(String key, String value) { + this.projects.add(new Project(key, value)); + } + + public void remove(String expectedProjectName) { + this.projects.removeIf(project -> expectedProjectName.equals(project.name)); + } + + public Set projects() { + return this.projects; + } + + @Override + public String toString() { + return "Projects=\n\t" + this.projects.stream().map(Object::toString) + .collect(Collectors.joining("\n\t")); + } + +} diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/VersionsFromBomBuilder.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/VersionsFromBomBuilder.java new file mode 100644 index 00000000..106e4cab --- /dev/null +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/buildsystem/VersionsFromBomBuilder.java @@ -0,0 +1,121 @@ +/* + * Copyright 2013-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.release.internal.buildsystem; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.springframework.cloud.release.internal.ReleaserProperties; +import org.springframework.cloud.release.internal.project.Project; + +public class VersionsFromBomBuilder { + + private ReleaserProperties releaserProperties; + + private Set projects = new HashSet<>(); + + private VersionsFromBom[] versionsFromBom = new VersionsFromBom[0]; + + private List parsers = new ArrayList<>(); + + private File thisProjectRoot; + + public VersionsFromBomBuilder thisProjectRoot(File thisProjectRoot) { + this.thisProjectRoot = thisProjectRoot; + return this; + } + + public VersionsFromBomBuilder releaserProperties( + ReleaserProperties releaserProperties) { + this.releaserProperties = releaserProperties; + return this; + } + + public VersionsFromBomBuilder projects(Set projects) { + this.projects = projects; + return this; + } + + public VersionsFromBomBuilder projects(VersionsFromBom... versionsFromBom) { + this.versionsFromBom = versionsFromBom; + return this; + } + + public VersionsFromBomBuilder parsers(List parsers) { + this.parsers = parsers; + return this; + } + + public VersionsFromBom merged() { + File thisProjectRoot = thisProjectRoot(); + CustomBomParser bomParser = parser(thisProjectRoot); + if (!this.projects.isEmpty()) { + return new VersionsFromBom(this.releaserProperties, bomParser, this.projects); + } + return new VersionsFromBom(this.releaserProperties, bomParser, + this.versionsFromBom); + } + + public VersionsFromBom retrieveFromBom() { + File thisProjectRoot = thisProjectRoot(); + CustomBomParser bomParser = parser(thisProjectRoot); + VersionsFromBom versionsFromBom = versionsFromBom(bomParser); + VersionsFromBom customParsing = customParsing(thisProjectRoot, this.projects); + return new VersionsFromBom(this.releaserProperties, bomParser, versionsFromBom, + customParsing); + } + + private File thisProjectRoot() { + return this.thisProjectRoot != null ? this.thisProjectRoot + : new File(this.releaserProperties.getWorkingDir()); + } + + private CustomBomParser parser(File thisProjectRoot) { + return this.parsers + .stream().filter(p -> p.isApplicable(thisProjectRoot, + this.releaserProperties, this.projects)) + .findFirst().orElse(CustomBomParser.NO_OP); + } + + private VersionsFromBom versionsFromBom(CustomBomParser bomParser) { + if (!this.projects.isEmpty()) { + return new VersionsFromBom(this.releaserProperties, bomParser, this.projects); + } + else if (this.versionsFromBom.length != 0) { + return new VersionsFromBom(this.releaserProperties, bomParser, + this.versionsFromBom); + } + return new VersionsFromBom(this.releaserProperties, bomParser); + } + + private VersionsFromBom customParsing(File thisProjectRoot, Set projects) { + return this.parsers.stream() + .filter(p -> p.isApplicable(thisProjectRoot, this.releaserProperties, + projects)) + .map(p -> p.parseBom(thisProjectRoot, this.releaserProperties)) + .reduce((versionsFromBom, + versionsFromBom2) -> new VersionsFromBomBuilder() + .parsers(this.parsers).thisProjectRoot(thisProjectRoot) + .releaserProperties(this.releaserProperties) + .projects(versionsFromBom, versionsFromBom2).merged()) + .orElse(VersionsFromBom.EMPTY_VERSION); + } + +} \ No newline at end of file diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/docs/CustomProjectDocumentationUpdater.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/docs/CustomProjectDocumentationUpdater.java new file mode 100644 index 00000000..b0e0410e --- /dev/null +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/docs/CustomProjectDocumentationUpdater.java @@ -0,0 +1,68 @@ +/* + * Copyright 2013-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.release.internal.docs; + +import java.io.File; + +import org.springframework.cloud.release.internal.project.ProjectVersion; + +/** + * @author Marcin Grzejszczak + */ +public interface CustomProjectDocumentationUpdater { + + /** + * NO OP implementation of the updater. + */ + CustomProjectDocumentationUpdater NO_OP = new CustomProjectDocumentationUpdater() { + @Override + public boolean isApplicable(File clonedDocumentationProject, + ProjectVersion currentProject, String bomBranch) { + return true; + } + + @Override + public File updateDocsRepo(File clonedDocumentationProject, + ProjectVersion currentProject, String bomBranch) { + return clonedDocumentationProject; + } + }; + + /** + * Different projects can have different documentation updaters. This method will tell + * whether the current updater should be applied or not. Updates the documentation + * repository. + * @param clonedDocumentationProject path to the cloned documentation project + * @param currentProject project to update the docs repo for + * @param bomBranch the bom project branch + * @return {@code true} if the parser should be applied. + */ + boolean isApplicable(File clonedDocumentationProject, ProjectVersion currentProject, + String bomBranch); + + /** + * Updates the documentation repository. + * @param clonedDocumentationProject path to the cloned documentation project + * @param currentProject project to update the docs repo for + * @param bomBranch the bom project branch + * @return {@link File cloned temporary directory} - {@code null} if wrong version is + * used + */ + File updateDocsRepo(File clonedDocumentationProject, ProjectVersion currentProject, + String bomBranch); + +} diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/docs/DocumentationUpdater.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/docs/DocumentationUpdater.java index 8c37e16a..35484bb3 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/docs/DocumentationUpdater.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/docs/DocumentationUpdater.java @@ -17,12 +17,13 @@ package org.springframework.cloud.release.internal.docs; import java.io.File; +import java.util.List; import org.springframework.cloud.release.internal.ReleaserProperties; import org.springframework.cloud.release.internal.ReleaserPropertiesAware; import org.springframework.cloud.release.internal.git.ProjectGitHandler; -import org.springframework.cloud.release.internal.pom.ProjectVersion; -import org.springframework.cloud.release.internal.pom.Projects; +import org.springframework.cloud.release.internal.project.ProjectVersion; +import org.springframework.cloud.release.internal.project.Projects; import org.springframework.cloud.release.internal.template.TemplateGenerator; /** @@ -37,10 +38,11 @@ public class DocumentationUpdater implements ReleaserPropertiesAware { private ReleaserProperties properties; public DocumentationUpdater(ProjectGitHandler gitHandler, - ReleaserProperties properties, TemplateGenerator templateGenerator) { + ReleaserProperties properties, TemplateGenerator templateGenerator, + List updaters) { this.properties = properties; - this.projectDocumentationUpdater = new ProjectDocumentationUpdater( - this.properties, gitHandler); + this.projectDocumentationUpdater = new ProjectDocumentationUpdater(properties, + gitHandler, updaters); this.releaseTrainContentsUpdater = new ReleaseTrainContentsUpdater( this.properties, gitHandler, templateGenerator); } @@ -92,8 +94,8 @@ public class DocumentationUpdater implements ReleaserPropertiesAware { @Override public void setReleaserProperties(ReleaserProperties properties) { this.properties = properties; - this.projectDocumentationUpdater.setReleaserProperties(properties); this.releaseTrainContentsUpdater.setReleaserProperties(properties); + this.projectDocumentationUpdater.setReleaserProperties(properties); } } diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/docs/ProjectDocumentationUpdater.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/docs/ProjectDocumentationUpdater.java index 1325c52a..fef25238 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/docs/ProjectDocumentationUpdater.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/docs/ProjectDocumentationUpdater.java @@ -17,8 +17,7 @@ package org.springframework.cloud.release.internal.docs; import java.io.File; -import java.io.IOException; -import java.nio.file.Files; +import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -26,39 +25,31 @@ import org.slf4j.LoggerFactory; import org.springframework.cloud.release.internal.ReleaserProperties; import org.springframework.cloud.release.internal.ReleaserPropertiesAware; import org.springframework.cloud.release.internal.git.ProjectGitHandler; -import org.springframework.cloud.release.internal.pom.ProjectVersion; +import org.springframework.cloud.release.internal.project.ProjectVersion; /** * @author Marcin Grzejszczak */ class ProjectDocumentationUpdater implements ReleaserPropertiesAware { - private static final String HTTP_SC_STATIC_URL = "http://cloud.spring.io/spring-cloud-static/"; - - private static final String HTTPS_SC_STATIC_URL = "https://cloud.spring.io/spring-cloud-static/"; - private static final Logger log = LoggerFactory .getLogger(ProjectDocumentationUpdater.class); private final ProjectGitHandler gitHandler; + private final List updaters; + private ReleaserProperties properties; ProjectDocumentationUpdater(ReleaserProperties properties, - ProjectGitHandler gitHandler) { + ProjectGitHandler gitHandler, + List updaters) { this.gitHandler = gitHandler; this.properties = properties; + this.updaters = updaters; } - /** - * Updates the documentation repository if current release train version is greater or - * equal than the one stored in the repo. - * @param currentProject project to update the docs repo for - * @param bomBranch the bom project branch - * @return {@link File cloned temporary directory} - {@code null} if wrong version is - * used - */ - File updateDocsRepo(ProjectVersion currentProject, String bomBranch) { + public File updateDocsRepo(ProjectVersion currentProject, String bomBranch) { if (!this.properties.getGit().isUpdateDocumentationRepo()) { log.info( "Will not update documentation repository, since the switch to do so " @@ -73,85 +64,10 @@ class ProjectDocumentationUpdater implements ReleaserPropertiesAware { } File documentationProject = this.gitHandler.cloneDocumentationProject(); log.debug("Cloning the doc project to [{}]", documentationProject); - String pathToIndexHtml = "current/index.html"; - File indexHtml = new File(documentationProject, pathToIndexHtml); - if (!indexHtml.exists()) { - throw new IllegalStateException( - "index.html is not present at [" + pathToIndexHtml + "]"); - } - return updateTheDocsRepo(bomBranch, documentationProject, indexHtml); - } - - private File updateTheDocsRepo(String springCloudReleaseBranch, - File documentationProject, File indexHtml) { - try { - String indexHtmlText = readIndexHtmlContents(indexHtml); - int httpIndex = indexHtmlText.indexOf(HTTP_SC_STATIC_URL); - int httpsIndex = indexHtmlText.indexOf(HTTPS_SC_STATIC_URL); - if (httpIndex == -1 && httpsIndex == -1) { - throw new IllegalStateException( - "The URL to the documentation repo not found in the index.html file"); - } - int beginIndex = beginIndex(httpIndex, httpsIndex); - String storedReleaseTrainLine = indexHtmlText.substring(beginIndex); - String storedReleaseTrain = storedReleaseTrainLine.substring(0, - storedReleaseTrainLine.indexOf("/")); - String firstLetterOfReleaseTrain = String - .valueOf(storedReleaseTrain.charAt(0)); - String currentReleaseTrainVersion = branchToReleaseVersion( - springCloudReleaseBranch); - String firstLetterOfCurrentReleaseTrain = String - .valueOf(currentReleaseTrainVersion.charAt(0)); - boolean newerOrEqualReleaseTrain = (!storedReleaseTrain - .equals(currentReleaseTrainVersion)) - && firstLetterOfCurrentReleaseTrain - .compareToIgnoreCase(firstLetterOfReleaseTrain) >= 0; - if (!newerOrEqualReleaseTrain) { - log.info( - "Current release train [{}] is not newer than the stored one [{}]", - currentReleaseTrainVersion, storedReleaseTrain); - return documentationProject; - } - return pushCommitedChanges(currentReleaseTrainVersion, documentationProject, - indexHtml, indexHtmlText, storedReleaseTrain); - } - catch (IOException e) { - throw new IllegalStateException(e); - } - } - - private int beginIndex(int httpIndex, int httpsIndex) { - if (httpIndex != -1) { - return httpIndex + HTTP_SC_STATIC_URL.length(); - } - return httpsIndex + HTTPS_SC_STATIC_URL.length(); - } - - private String branchToReleaseVersion(String springCloudReleaseBranch) { - if (springCloudReleaseBranch.startsWith("v")) { - return springCloudReleaseBranch.substring(1); - } - return springCloudReleaseBranch; - } - - private File pushCommitedChanges(String currentReleaseTrainVersion, - File documentationProject, File indexHtml, String indexHtmlText, - String storedReleaseTrain) throws IOException { - String replacedIndexHtml = indexHtmlText.replace(storedReleaseTrain, - currentReleaseTrainVersion); - Files.write(indexHtml.toPath(), replacedIndexHtml.getBytes()); - log.info("Stored the release train [{}] in [{}]", currentReleaseTrainVersion, - indexHtml.getAbsolutePath()); - this.gitHandler.commit(documentationProject, - "Updating the link to the current version to [" - + currentReleaseTrainVersion + "]"); - this.gitHandler.pushCurrentBranch(documentationProject); - log.info("Committed and pushed changes to the documentation project"); - return documentationProject; - } - - String readIndexHtmlContents(File indexHtml) throws IOException { - return new String(Files.readAllBytes(indexHtml.toPath())); + CustomProjectDocumentationUpdater updater = this.updaters.stream().filter( + u -> u.isApplicable(documentationProject, currentProject, bomBranch)) + .findFirst().orElse(CustomProjectDocumentationUpdater.NO_OP); + return updater.updateDocsRepo(documentationProject, currentProject, bomBranch); } @Override diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/docs/ReleaseTrainContentsUpdater.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/docs/ReleaseTrainContentsUpdater.java index ecf432c1..d37e667d 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/docs/ReleaseTrainContentsUpdater.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/docs/ReleaseTrainContentsUpdater.java @@ -33,8 +33,8 @@ import org.slf4j.LoggerFactory; import org.springframework.cloud.release.internal.ReleaserProperties; import org.springframework.cloud.release.internal.ReleaserPropertiesAware; import org.springframework.cloud.release.internal.git.ProjectGitHandler; -import org.springframework.cloud.release.internal.pom.ProjectVersion; -import org.springframework.cloud.release.internal.pom.Projects; +import org.springframework.cloud.release.internal.project.ProjectVersion; +import org.springframework.cloud.release.internal.project.Projects; import org.springframework.cloud.release.internal.tech.HandlebarsHelper; import org.springframework.cloud.release.internal.template.TemplateGenerator; import org.springframework.util.StringUtils; @@ -42,6 +42,7 @@ import org.springframework.util.StringUtils; /** * @author Marcin Grzejszczak */ +// TODO: [SPRING-CLOUD] class ReleaseTrainContentsUpdater implements ReleaserPropertiesAware { private static final Logger log = LoggerFactory diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/docs/Row.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/docs/Row.java index f85e1e5f..b9b8d4a5 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/docs/Row.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/docs/Row.java @@ -21,8 +21,8 @@ import java.util.List; import java.util.Objects; import java.util.stream.Collectors; -import org.springframework.cloud.release.internal.pom.ProjectVersion; -import org.springframework.cloud.release.internal.pom.Projects; +import org.springframework.cloud.release.internal.project.ProjectVersion; +import org.springframework.cloud.release.internal.project.Projects; /** * @author Marcin Grzejszczak diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/git/ProjectGitHandler.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/git/ProjectGitHandler.java index 4bea131e..a3fa22be 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/git/ProjectGitHandler.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/git/ProjectGitHandler.java @@ -27,13 +27,12 @@ import org.slf4j.LoggerFactory; import org.springframework.cloud.release.internal.ReleaserProperties; import org.springframework.cloud.release.internal.ReleaserPropertiesAware; -import org.springframework.cloud.release.internal.pom.ProjectVersion; -import org.springframework.cloud.release.internal.pom.Projects; +import org.springframework.cloud.release.internal.project.ProjectVersion; import org.springframework.cloud.release.internal.tech.TemporaryFileStorage; import org.springframework.util.StringUtils; /** - * Contains business logic around Git & Github operations. + * Contains business logic around Git operations. * * @author Marcin Grzejszczak */ @@ -51,19 +50,17 @@ public class ProjectGitHandler implements ReleaserPropertiesAware { private static final String POST_RELEASE_BUMP_MSG = "Bumping versions to %s after release"; - private final GithubMilestones githubMilestones; - - private final GithubIssues githubIssues; - private ReleaserProperties properties; public ProjectGitHandler(ReleaserProperties properties) { this.properties = properties; - this.githubMilestones = new GithubMilestones(properties); - this.githubIssues = new GithubIssues(properties); registerShutdownHook(); } + static void clearCache() { + CACHE.clear(); + } + private void registerShutdownHook() { Runtime.getRuntime().addShutdownHook(new Thread(TemporaryFileStorage::cleanup)); } @@ -267,22 +264,6 @@ public class ProjectGitHandler implements ReleaserPropertiesAware { gitRepo(project).pushCurrentBranch(); } - public void closeMilestone(ProjectVersion releaseVersion) { - this.githubMilestones.closeMilestone(releaseVersion); - } - - public void createIssueInSpringGuides(Projects projects, ProjectVersion version) { - this.githubIssues.fileIssueInSpringGuides(projects, version); - } - - public void createIssueInStartSpringIo(Projects projects, ProjectVersion version) { - this.githubIssues.fileIssueInStartSpringIo(projects, version); - } - - public String milestoneUrl(ProjectVersion releaseVersion) { - return this.githubMilestones.milestoneUrl(releaseVersion); - } - public String currentBranch(File project) { return gitRepo(project).currentBranch(); } diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/git/CachingGithub.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/github/CachingGithub.java similarity index 99% rename from spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/git/CachingGithub.java rename to spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/github/CachingGithub.java index 834c1804..7a52bfdb 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/git/CachingGithub.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/github/CachingGithub.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.release.internal.git; +package org.springframework.cloud.release.internal.github; import java.io.IOException; import java.util.Map; diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/git/GithubIssues.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/github/GithubIssues.java similarity index 96% rename from spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/git/GithubIssues.java rename to spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/github/GithubIssues.java index daa04a07..f4db3caa 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/git/GithubIssues.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/github/GithubIssues.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.release.internal.git; +package org.springframework.cloud.release.internal.github; import java.io.IOException; import java.util.HashMap; @@ -30,8 +30,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.release.internal.ReleaserProperties; -import org.springframework.cloud.release.internal.pom.ProjectVersion; -import org.springframework.cloud.release.internal.pom.Projects; +import org.springframework.cloud.release.internal.project.ProjectVersion; +import org.springframework.cloud.release.internal.project.Projects; import org.springframework.util.Assert; import org.springframework.util.StringUtils; diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/git/GithubMilestones.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/github/GithubMilestones.java similarity index 98% rename from spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/git/GithubMilestones.java rename to spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/github/GithubMilestones.java index ac3918f8..455c522f 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/git/GithubMilestones.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/github/GithubMilestones.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.release.internal.git; +package org.springframework.cloud.release.internal.github; import java.io.IOException; import java.net.URL; @@ -32,7 +32,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.release.internal.ReleaserProperties; -import org.springframework.cloud.release.internal.pom.ProjectVersion; +import org.springframework.cloud.release.internal.project.ProjectVersion; import org.springframework.util.Assert; import org.springframework.util.StringUtils; diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/github/ProjectGitHubHandler.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/github/ProjectGitHubHandler.java new file mode 100644 index 00000000..468ffcc5 --- /dev/null +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/github/ProjectGitHubHandler.java @@ -0,0 +1,75 @@ +/* + * Copyright 2013-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.release.internal.github; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.cloud.release.internal.ReleaserProperties; +import org.springframework.cloud.release.internal.ReleaserPropertiesAware; +import org.springframework.cloud.release.internal.project.ProjectVersion; +import org.springframework.cloud.release.internal.project.Projects; +import org.springframework.cloud.release.internal.tech.TemporaryFileStorage; + +/** + * Contains business logic around Github operations. + * + * @author Marcin Grzejszczak + */ +public class ProjectGitHubHandler implements ReleaserPropertiesAware { + + private static final Logger log = LoggerFactory.getLogger(ProjectGitHubHandler.class); + + private final GithubMilestones githubMilestones; + + private final GithubIssues githubIssues; + + private ReleaserProperties properties; + + public ProjectGitHubHandler(ReleaserProperties properties) { + this.properties = properties; + this.githubMilestones = new GithubMilestones(properties); + this.githubIssues = new GithubIssues(properties); + registerShutdownHook(); + } + + private void registerShutdownHook() { + Runtime.getRuntime().addShutdownHook(new Thread(TemporaryFileStorage::cleanup)); + } + + public void closeMilestone(ProjectVersion releaseVersion) { + this.githubMilestones.closeMilestone(releaseVersion); + } + + public void createIssueInSpringGuides(Projects projects, ProjectVersion version) { + this.githubIssues.fileIssueInSpringGuides(projects, version); + } + + public void createIssueInStartSpringIo(Projects projects, ProjectVersion version) { + this.githubIssues.fileIssueInStartSpringIo(projects, version); + } + + public String milestoneUrl(ProjectVersion releaseVersion) { + return this.githubMilestones.milestoneUrl(releaseVersion); + } + + @Override + public void setReleaserProperties(ReleaserProperties properties) { + this.properties = properties; + } + +} diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/BomParser.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/BomParser.java deleted file mode 100644 index 642e8514..00000000 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/BomParser.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright 2013-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cloud.release.internal.pom; - -import java.io.File; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.function.Function; -import java.util.function.Predicate; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -import org.apache.maven.model.Model; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.springframework.cloud.release.internal.ReleaserProperties; - -import static org.springframework.cloud.release.internal.pom.SpringCloudConstants.CLOUD_DEPENDENCIES_PARENT_ARTIFACT_ID; - -/** - * Parses the poms for a given project and populates versions from a release train. - * - * @author Marcin Grzejszczak - */ -class BomParser { - - private static final Logger log = LoggerFactory.getLogger(BomParser.class); - - private final File thisProjectRoot; - - private final String pomWithBootStarterParent; - - private final String thisTrainBom; - - private final PomReader pomReader = new PomReader(); - - private final Pattern versionPattern; - - private final ReleaserProperties properties; - - BomParser(ReleaserProperties properties, File thisProjectRoot) { - this.thisProjectRoot = thisProjectRoot; - this.pomWithBootStarterParent = properties.getPom().getPomWithBootStarterParent(); - this.thisTrainBom = properties.getPom().getThisTrainBom(); - this.versionPattern = Pattern.compile(properties.getPom().getBomVersionPattern()); - this.properties = properties; - } - - Versions allVersions() { - Versions boot = bootVersion(); - Versions cloud = versionsFromBom(); - return new Versions(boot.bootVersion, cloud.scBuildVersion, - allProjects(boot, cloud)); - } - - private Set allProjects(Versions boot, Versions cloud) { - Set allProjects = new HashSet<>(); - allProjects.addAll(boot.projects); - allProjects.addAll(cloud.projects); - return allProjects; - } - - Versions bootVersion() { - Model model = pom(this.pomWithBootStarterParent); - if (model == null) { - return Versions.EMPTY_VERSION; - } - String bootArtifactId = model.getParent().getArtifactId(); - log.debug("Boot artifact id is equal to [{}]", bootArtifactId); - if (!SpringCloudConstants.BOOT_STARTER_PARENT_ARTIFACT_ID - .equals(bootArtifactId)) { - throw new IllegalStateException("The pom doesn't have a [" - + SpringCloudConstants.BOOT_STARTER_PARENT_ARTIFACT_ID - + "] artifact id"); - } - String bootVersion = model.getParent().getVersion(); - log.debug("Boot version is equal to [{}]", bootVersion); - return new Versions(bootVersion); - } - - private Model pom(String pom) { - if (pom == null) { - throw new IllegalStateException("Pom is not present"); - } - File pomFile = new File(this.thisProjectRoot, pom); - if (!pomFile.exists()) { - throw new IllegalStateException("Pom is not present"); - } - return this.pomReader.readPom(pomFile); - } - - // the BOM contains all versions of projects and its parent MUST be Spring Cloud - // Dependencies Parent - Versions versionsFromBom() { - Model model = pom(this.thisTrainBom); - if (model == null) { - return Versions.EMPTY_VERSION; - } - String buildArtifact = model.getParent().getArtifactId(); - log.debug("[{}] artifact id is equal to [{}]", - CLOUD_DEPENDENCIES_PARENT_ARTIFACT_ID, buildArtifact); - if (!CLOUD_DEPENDENCIES_PARENT_ARTIFACT_ID.equals(buildArtifact)) { - throw new IllegalStateException("The pom doesn't have a [" - + CLOUD_DEPENDENCIES_PARENT_ARTIFACT_ID + "] artifact id"); - } - String buildVersion = model.getParent().getVersion(); - log.debug("Spring Cloud Build version is equal to [{}]", buildVersion); - Set projects = model.getProperties().entrySet().stream() - .filter(propertyMatchesSCPattern()).map(toProject()) - .collect(Collectors.toSet()); - String releaseTrainProjectVersion = model.getVersion(); - projects.add( - new Project(this.properties.getMetaRelease().getReleaseTrainProjectName(), - releaseTrainProjectVersion)); - return new Versions(buildVersion, projects); - } - - private Predicate> propertyMatchesSCPattern() { - return entry -> this.versionPattern.matcher(entry.getKey().toString()).matches(); - } - - private Function, Project> toProject() { - return entry -> { - Matcher matcher = this.versionPattern.matcher(entry.getKey().toString()); - // you have to first match to get info about the group - matcher.matches(); - String name = matcher.group(1); - return new Project(name, entry.getValue().toString()); - }; - } - -} diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/Versions.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/Versions.java deleted file mode 100644 index ebe915eb..00000000 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/Versions.java +++ /dev/null @@ -1,286 +0,0 @@ -/* - * Copyright 2013-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cloud.release.internal.pom; - -import java.io.File; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Properties; -import java.util.Set; -import java.util.stream.Collectors; - -import org.springframework.cloud.release.internal.ReleaserProperties; - -import static org.springframework.cloud.release.internal.pom.SpringCloudConstants.BOOT_DEPENDENCIES_ARTIFACT_ID; -import static org.springframework.cloud.release.internal.pom.SpringCloudConstants.BOOT_STARTER_PARENT_ARTIFACT_ID; -import static org.springframework.cloud.release.internal.pom.SpringCloudConstants.BUILD_ARTIFACT_ID; -import static org.springframework.cloud.release.internal.pom.SpringCloudConstants.CLOUD_DEPENDENCIES_PARENT_ARTIFACT_ID; - -/** - * Represents versions taken out from Spring Cloud Release pom. - * - * @author Marcin Grzejszczak - */ -class Versions { - - static final Versions EMPTY_VERSION = new Versions(""); - - private static final String SPRING_BOOT_PROJECT_NAME = "spring-boot"; - - String bootVersion; - - String scBuildVersion; - - Set projects = new HashSet<>(); - - ReleaserProperties properties; - - Versions(String bootVersion) { - this.bootVersion = bootVersion; - add(SPRING_BOOT_PROJECT_NAME, bootVersion); - add(BOOT_STARTER_PARENT_ARTIFACT_ID, bootVersion); - add(BOOT_DEPENDENCIES_ARTIFACT_ID, bootVersion); - this.properties = new ReleaserProperties(); - } - - Versions(String scBuildVersion, Set projects) { - this.scBuildVersion = scBuildVersion; - add(BUILD_ARTIFACT_ID, scBuildVersion); - add(CLOUD_DEPENDENCIES_PARENT_ARTIFACT_ID, scBuildVersion); - this.projects.addAll(projects); - this.properties = new ReleaserProperties(); - } - - Versions(String bootVersion, String scBuildVersion, Set projects) { - this(new ReleaserProperties(), bootVersion, scBuildVersion, projects); - } - - Versions(ReleaserProperties properties, String bootVersion, String scBuildVersion, - Set projects) { - this.properties = properties; - this.bootVersion = bootVersion; - this.scBuildVersion = scBuildVersion; - add(SPRING_BOOT_PROJECT_NAME, bootVersion); - add(BOOT_STARTER_PARENT_ARTIFACT_ID, bootVersion); - add(BOOT_DEPENDENCIES_ARTIFACT_ID, bootVersion); - add(BUILD_ARTIFACT_ID, scBuildVersion); - add(dependenciesParentArtifactId(), scBuildVersion); - this.projects.addAll(projects); - } - - Versions(Set versions, ReleaserProperties properties) { - this.properties = properties; - this.bootVersion = versions.stream() - .filter(projectVersion -> SPRING_BOOT_PROJECT_NAME - .equals(projectVersion.projectName)) - .findFirst() - .orElse(new ProjectVersion(SPRING_BOOT_PROJECT_NAME, "")).version; - this.scBuildVersion = versions.stream().filter( - projectVersion -> BUILD_ARTIFACT_ID.equals(projectVersion.projectName)) - .findFirst().orElse(new ProjectVersion(BUILD_ARTIFACT_ID, "")).version; - versions.forEach(projectVersion -> setVersion(projectVersion.projectName, - projectVersion.version)); - } - - private String bomProjectName() { - return this.properties.getMetaRelease().getReleaseTrainProjectName(); - } - - private String dependenciesArtifactId() { - String artifactId = this.properties.getPom().getThisTrainBom(); - return artifactId.split(File.separator)[0]; - } - - private String dependenciesParentArtifactId() { - return dependenciesArtifactId() + "-parent"; - } - - String versionForProject(String projectName) { - return this.projects.stream().filter(project -> nameMatches(projectName, project)) - .findFirst().orElse(Project.EMPTY_PROJECT).version; - } - - boolean shouldBeUpdated(String projectName) { - return this.projects.stream() - .anyMatch(project -> nameMatches(projectName, project)); - } - - boolean shouldSetProperty(Properties properties) { - return this.projects.stream() - .anyMatch(project -> properties.containsKey(project.name + ".version")); - } - - Projects toProjectVersions() { - return this.projects.stream() - .map(project -> new ProjectVersion(project.name, project.version)) - .collect(Collectors.toCollection(Projects::new)); - } - - /** - * The only exception is spring-cloud-dependencies (e.g. Greenwich.RELEASE) and - * spring-cloud-dependencies-parent (e.g. 2.1.0.RELEASE) - */ - private boolean nameMatches(String projectName, Project project) { - if (project.name.equals(projectName)) { - return true; - } - boolean parent = matchesNameWithSuffix(projectName, "-parent", project); - boolean bomArtifactId = comparisonOfBomArtifactAndParent(projectName, project); - return !bomArtifactId && (parent - || matchesNameWithSuffix(projectName, "-dependencies", project)); - } - - private boolean comparisonOfBomArtifactAndParent(String projectName, - Project project) { - return artifactOrParent(projectName, project.name) - || artifactOrParent(project.name, projectName); - } - - private boolean artifactOrParent(String projectName, String otherProjectName) { - return projectName.equals(dependenciesArtifactId()) - && otherProjectName.equals(dependenciesParentArtifactId()); - } - - private boolean matchesNameWithSuffix(String projectName, String suffix, - Project project) { - boolean containsSuffix = projectName.endsWith(suffix); - if (!containsSuffix) { - return false; - } - String withoutSuffix = projectName.substring(0, projectName.indexOf(suffix)); - return project.name.equals(withoutSuffix); - } - - Versions setVersion(String projectName, String version) { - switch (projectName) { - case SPRING_BOOT_PROJECT_NAME: - case BOOT_STARTER_PARENT_ARTIFACT_ID: - case BOOT_DEPENDENCIES_ARTIFACT_ID: - updateBootVersions(version); - break; - case BUILD_ARTIFACT_ID: - case CLOUD_DEPENDENCIES_PARENT_ARTIFACT_ID: - updateBuildVersions(version); - break; - default: - if (bomVersionProjectNames().contains(projectName)) { - updateBomVersions(version); - } - else { - remove(projectName); - add(projectName, version); - } - } - return this; - } - - private List bomVersionProjectNames() { - List names = new ArrayList<>( - this.properties.getMetaRelease().getReleaseTrainDependencyNames()); - names.add(this.properties.getMetaRelease().getReleaseTrainProjectName()); - return names; - } - - private void updateBuildVersions(String version) { - this.scBuildVersion = version; - remove(BUILD_ARTIFACT_ID); - remove(CLOUD_DEPENDENCIES_PARENT_ARTIFACT_ID); - add(BUILD_ARTIFACT_ID, version); - add(CLOUD_DEPENDENCIES_PARENT_ARTIFACT_ID, version); - } - - private void updateBootVersions(String version) { - this.bootVersion = version; - remove(SPRING_BOOT_PROJECT_NAME); - remove(BOOT_DEPENDENCIES_ARTIFACT_ID); - remove(BOOT_STARTER_PARENT_ARTIFACT_ID); - add(SPRING_BOOT_PROJECT_NAME, version); - add(BOOT_STARTER_PARENT_ARTIFACT_ID, version); - add(BOOT_DEPENDENCIES_ARTIFACT_ID, version); - } - - private void updateBomVersions(String version) { - remove(bomProjectName()); - bomVersionProjectNames().forEach(this::remove); - add(bomProjectName(), version); - bomVersionProjectNames().forEach(s -> add(s, version)); - } - - private void add(String key, String value) { - this.projects.add(new Project(key, value)); - } - - private void remove(String expectedProjectName) { - this.projects.removeIf(project -> expectedProjectName.equals(project.name)); - } - - @Override - public String toString() { - return "Spring Boot Version=[" + this.bootVersion + ']' - + "\nSpring Cloud Build Version=[" + this.scBuildVersion + ']' - + "\nProjects=\n\t" + this.projects.stream().map(Object::toString) - .collect(Collectors.joining("\n\t")); - } - -} - -/** - * @author Marcin Grzejszczak - */ -class Project { - - static Project EMPTY_PROJECT = new Project("", ""); - - final String name; - - final String version; - - Project(String name, String version) { - this.name = name; - this.version = version; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - Project project = (Project) o; - if (this.name != null ? !this.name.equals(project.name) : project.name != null) { - return false; - } - return this.version != null ? this.version.equals(project.version) - : project.version == null; - } - - @Override - public int hashCode() { - int result = this.name != null ? this.name.hashCode() : 0; - result = 31 * result + (this.version != null ? this.version.hashCode() : 0); - return result; - } - - @Override - public String toString() { - return "name=[" + this.name + "], version=[" + this.version + ']'; - } - -} diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/post/PostReleaseActions.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/postrelease/PostReleaseActions.java similarity index 92% rename from spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/post/PostReleaseActions.java rename to spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/postrelease/PostReleaseActions.java index 75a533bd..82834fd2 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/post/PostReleaseActions.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/postrelease/PostReleaseActions.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.release.internal.post; +package org.springframework.cloud.release.internal.postrelease; import java.io.Closeable; import java.io.File; @@ -32,13 +32,13 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.release.internal.ReleaserProperties; +import org.springframework.cloud.release.internal.buildsystem.GradleUpdater; +import org.springframework.cloud.release.internal.buildsystem.ProjectPomUpdater; import org.springframework.cloud.release.internal.git.ProjectGitHandler; -import org.springframework.cloud.release.internal.gradle.GradleUpdater; -import org.springframework.cloud.release.internal.pom.ProcessedProject; -import org.springframework.cloud.release.internal.pom.ProjectPomUpdater; -import org.springframework.cloud.release.internal.pom.ProjectVersion; -import org.springframework.cloud.release.internal.pom.Projects; -import org.springframework.cloud.release.internal.project.ProjectBuilder; +import org.springframework.cloud.release.internal.project.ProcessedProject; +import org.springframework.cloud.release.internal.project.ProjectCommandExecutor; +import org.springframework.cloud.release.internal.project.ProjectVersion; +import org.springframework.cloud.release.internal.project.Projects; import org.springframework.cloud.release.internal.versions.VersionsFetcher; import org.springframework.core.NestedExceptionUtils; import org.springframework.util.StringUtils; @@ -58,7 +58,7 @@ public class PostReleaseActions implements Closeable { private final GradleUpdater gradleUpdater; - private final ProjectBuilder projectBuilder; + private final ProjectCommandExecutor projectCommandExecutor; private final ReleaserProperties properties; @@ -66,12 +66,12 @@ public class PostReleaseActions implements Closeable { public PostReleaseActions(ProjectGitHandler projectGitHandler, ProjectPomUpdater projectPomUpdater, GradleUpdater gradleUpdater, - ProjectBuilder projectBuilder, ReleaserProperties properties, + ProjectCommandExecutor projectCommandExecutor, ReleaserProperties properties, VersionsFetcher versionsFetcher) { this.projectGitHandler = projectGitHandler; this.projectPomUpdater = projectPomUpdater; this.gradleUpdater = gradleUpdater; - this.projectBuilder = projectBuilder; + this.projectCommandExecutor = projectCommandExecutor; this.properties = properties; this.versionsFetcher = versionsFetcher; } @@ -117,7 +117,7 @@ public class PostReleaseActions implements Closeable { Projects newProjects = addVersionForTestsProject(projects, projectVersion, releaseTrainVersion); updateWithVersions(file, newProjects); - this.projectBuilder.build(projectVersion, file.getAbsolutePath()); + this.projectCommandExecutor.build(projectVersion, file.getAbsolutePath()); } /** @@ -177,8 +177,8 @@ public class PostReleaseActions implements Closeable { .map(this::getSingleResult).collect(Collectors.toList()); } - ProjectBuilder projectBuilder(ProcessedProject processedProject) { - return new ProjectBuilder(processedProject.propertiesForProject); + ProjectCommandExecutor projectBuilder(ProcessedProject processedProject) { + return new ProjectCommandExecutor(processedProject.propertiesForProject); } private Future> updateAllProjects(Projects projects, @@ -296,7 +296,7 @@ public class PostReleaseActions implements Closeable { Projects newProjects = addVersionForTestsProject(projects, projectVersion, releaseTrainVersion); updateWithVersions(file, newProjects); - this.projectBuilder.generateReleaseTrainDocs(releaseTrainVersion, + this.projectCommandExecutor.generateReleaseTrainDocs(releaseTrainVersion, file.getAbsolutePath()); } diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/ProcessedProject.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/ProcessedProject.java similarity index 96% rename from spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/ProcessedProject.java rename to spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/ProcessedProject.java index c4072a88..4e3004ae 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/ProcessedProject.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/ProcessedProject.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.release.internal.pom; +package org.springframework.cloud.release.internal.project; import org.springframework.cloud.release.internal.ReleaserProperties; diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/Project.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/Project.java new file mode 100644 index 00000000..15bcec9c --- /dev/null +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/Project.java @@ -0,0 +1,74 @@ +/* + * Copyright 2013-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.release.internal.project; + +/** + * Represents a single project. + * + * @author Marcin Grzejszczak + */ +public class Project { + + /** + * An empty project. + */ + public static Project EMPTY_PROJECT = new Project("", ""); + + /** + * Project name. + */ + public final String name; + + /** + * Project version. + */ + public final String version; + + public Project(String name, String version) { + this.name = name; + this.version = version; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Project project = (Project) o; + if (this.name != null ? !this.name.equals(project.name) : project.name != null) { + return false; + } + return this.version != null ? this.version.equals(project.version) + : project.version == null; + } + + @Override + public int hashCode() { + int result = this.name != null ? this.name.hashCode() : 0; + result = 31 * result + (this.version != null ? this.version.hashCode() : 0); + return result; + } + + @Override + public String toString() { + return "name=[" + this.name + "], version=[" + this.version + ']'; + } + +} diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/ProjectBuilder.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/ProjectCommandExecutor.java similarity index 50% rename from spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/ProjectBuilder.java rename to spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/ProjectCommandExecutor.java index 6f770726..aa9c4144 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/ProjectBuilder.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/ProjectCommandExecutor.java @@ -18,6 +18,7 @@ package org.springframework.cloud.release.internal.project; import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; @@ -27,77 +28,75 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Scanner; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.release.internal.ReleaserProperties; import org.springframework.cloud.release.internal.ReleaserPropertiesAware; -import org.springframework.cloud.release.internal.pom.ProjectVersion; import org.springframework.util.StringUtils; /** * @author Marcin Grzejszczak */ -public class ProjectBuilder implements ReleaserPropertiesAware { +public class ProjectCommandExecutor implements ReleaserPropertiesAware { - /** - * Enumeration over commonly used Maven profiles. - */ - private enum Profile { - - /** - * Profile used for milestone versions. - */ - MILESTONE, - - /** - * Profile used for ga versions. - */ - CENTRAL, - - /** - * Profile used to run integration tests. - */ - INTEGRATION, - - /** - * Profile used to run guides publishing. - */ - GUIDES; - - /** - * Converts the profile to lowercase, maven command line property. - * @return profile with prepended -P - */ - public String asMavenProfile() { - return "-P" + this.name().toLowerCase(); - } - - } - - private static final Logger log = LoggerFactory.getLogger(ProjectBuilder.class); + private static final Logger log = LoggerFactory + .getLogger(ProjectCommandExecutor.class); private static final String VERSION_MUSTACHE = "{{version}}"; private ReleaserProperties properties; - public ProjectBuilder(ReleaserProperties properties) { + public ProjectCommandExecutor(ReleaserProperties properties) { this.properties = properties; } + // If you want to call commands that are not parameterized via the props + public ProjectCommandExecutor() { + this.properties = new ReleaserProperties(); + } + public void build(ProjectVersion versionFromReleaseTrain) { build(versionFromReleaseTrain, this.properties.getWorkingDir()); } + public String version() { + return executeCommand( + new CommandPicker(this.properties, this.properties.getWorkingDir()) + .version()); + } + + public String groupId() { + return executeCommand( + new CommandPicker(this.properties, this.properties.getWorkingDir()) + .groupId()); + } + + private String executeCommand(String command) { + try { + String projectRoot = this.properties.getWorkingDir(); + String[] commands = command.split(" "); + return runCommand(projectRoot, commands); + } + catch (IllegalStateException e) { + throw e; + } + catch (Exception e) { + throw new IllegalStateException(e); + } + } + public void build(ProjectVersion versionFromReleaseTrain, String projectRoot) { try { - String[] commands = commandWithSystemProps( - this.properties.getMaven().getBuildCommand(), versionFromReleaseTrain) - .split(" "); + String[] commands = new CommandPicker(this.properties, projectRoot) + .buildCommand(versionFromReleaseTrain).split(" "); runCommand(projectRoot, commands); assertNoHtmlFilesInDocsContainUnresolvedTags(projectRoot); log.info("No HTML files from docs contain unresolved tags"); @@ -109,8 +108,9 @@ public class ProjectBuilder implements ReleaserPropertiesAware { public void generateReleaseTrainDocs(String version, String projectRoot) { try { - String updatedCommand = this.properties.getMaven() - .getGenerateReleaseTrainDocsCommand() + String updatedCommand = new CommandPicker(properties, projectRoot) + .generateReleaseTrainDocsCommand( + new ProjectVersion(new File(projectRoot))) .replace(VERSION_MUSTACHE, version); runCommand(projectRoot, updatedCommand.split(" ")); assertNoHtmlFilesInDocsContainUnresolvedTags(this.properties.getWorkingDir()); @@ -121,39 +121,6 @@ public class ProjectBuilder implements ReleaserPropertiesAware { } } - private String commandWithSystemProps(String command, ProjectVersion version, - Profile... profiles) { - if (command.contains(ReleaserProperties.Maven.SYSTEM_PROPS_PLACEHOLDER)) { - return appendProfile(command, version, profiles); - } - return appendProfile(command, version, profiles) + " " - + ReleaserProperties.Maven.SYSTEM_PROPS_PLACEHOLDER; - } - - private String appendProfile(String command, ProjectVersion version, - Profile... profiles) { - String trimmedCommand = command.trim(); - if (version.isMilestone() || version.isRc()) { - log.info("Adding the milestone profile to the Maven build"); - return trimmedCommand + " " + Profile.MILESTONE.asMavenProfile() - + profilesToString(profiles); - } - else if (version.isRelease() || version.isServiceRelease()) { - log.info("Adding the central profile to the Maven build"); - return trimmedCommand + " " + Profile.CENTRAL.asMavenProfile() - + profilesToString(profiles); - } - else { - log.info("The build is a snapshot one - will not add any profiles"); - } - return trimmedCommand; - } - - private String profilesToString(Profile... profiles) { - return Arrays.stream(profiles).map(profile -> "-P" + profile) - .collect(Collectors.joining(" ")); - } - private void assertNoHtmlFilesInDocsContainUnresolvedTags(String workingDir) { try { File docs = new File(workingDir, "docs"); @@ -168,18 +135,18 @@ public class ProjectBuilder implements ReleaserPropertiesAware { } public void deploy(ProjectVersion version) { - doDeploy(version, this.properties.getMaven().getDeployCommand()); + doDeploy(new CommandPicker(properties, this.properties.getWorkingDir()) + .deployCommand(version)); } public void deployGuides(ProjectVersion version) { - doDeploy(version, this.properties.getMaven().getDeployGuidesCommand(), - Profile.GUIDES, Profile.INTEGRATION); + doDeploy(new CommandPicker(properties, this.properties.getWorkingDir()) + .deployGuidesCommand(version)); } - private void doDeploy(ProjectVersion version, String command, Profile... profiles) { + private void doDeploy(String command) { try { - String[] commands = commandWithSystemProps(command, version, profiles) - .split(" "); + String[] commands = command.split(" "); runCommand(commands); log.info("The project has successfully been deployed"); } @@ -192,10 +159,11 @@ public class ProjectBuilder implements ReleaserPropertiesAware { runCommand(this.properties.getWorkingDir(), commands); } - private void runCommand(String projectRoot, String[] commands) { + private String runCommand(String projectRoot, String[] commands) { String[] substitutedCommands = substituteSystemProps(commands); - long waitTimeInMinutes = this.properties.getMaven().getWaitTimeInMinutes(); - executor(projectRoot).runCommand(substitutedCommands, waitTimeInMinutes); + long waitTimeInMinutes = new CommandPicker(properties, projectRoot) + .waitTimeInMinutes(); + return executor(projectRoot).runCommand(substitutedCommands, waitTimeInMinutes); } ProcessExecutor executor(String workDir) { @@ -204,7 +172,7 @@ public class ProjectBuilder implements ReleaserPropertiesAware { public void publishDocs(String version) { try { - for (String command : this.properties.getMaven().getPublishDocsCommands()) { + for (String command : new CommandPicker(properties).publishDocsCommands()) { command = command.replace(VERSION_MUSTACHE, version); String[] commands = command.split(" "); runCommand(commands); @@ -221,10 +189,12 @@ public class ProjectBuilder implements ReleaserPropertiesAware { * just pasting the String that contains these values. */ private String[] substituteSystemProps(String... commands) { - boolean containsSystemProps = this.properties.getMaven().getSystemProperties() - .contains("-D"); - String[] splitSystemProps = StringUtils.delimitedListToStringArray( - this.properties.getMaven().getSystemProperties(), "-D"); + String systemProperties = new CommandPicker(this.properties).systemProperties(); + String systemPropertiesPlaceholder = new CommandPicker(this.properties) + .systemPropertiesPlaceholder(); + boolean containsSystemProps = systemProperties.contains("-D"); + String[] splitSystemProps = StringUtils + .delimitedListToStringArray(systemProperties, "-D"); // first element might be empty even though the second one contains values if (splitSystemProps.length > 1) { splitSystemProps = StringUtils.isEmpty(splitSystemProps[0]) @@ -237,7 +207,7 @@ public class ProjectBuilder implements ReleaserPropertiesAware { : splitSystemProps; final AtomicInteger index = new AtomicInteger(-1); for (int i = 0; i < commands.length; i++) { - if (commands[i].contains(ReleaserProperties.Maven.SYSTEM_PROPS_PLACEHOLDER)) { + if (commands[i].contains(systemPropertiesPlaceholder)) { index.set(i); break; } @@ -282,7 +252,7 @@ class ProcessExecutor implements ReleaserPropertiesAware { this.workingDir = workingDir; } - void runCommand(String[] commands, long waitTimeInMinutes) { + String runCommand(String[] commands, long waitTimeInMinutes) { try { String workingDir = this.workingDir; log.info( @@ -302,12 +272,18 @@ class ProcessExecutor implements ReleaserPropertiesAware { throw new IllegalStateException("The process has exited with exit code [" + process.exitValue() + "]"); } + return convertStreamToString(process.getInputStream()); } catch (InterruptedException | IOException e) { throw new IllegalStateException(e); } } + private String convertStreamToString(InputStream is) { + Scanner scanner = new Scanner(is).useDelimiter("\\A"); + return scanner.hasNext() ? scanner.next() : ""; + } + Process startProcess(ProcessBuilder builder) throws IOException { return builder.start(); } @@ -323,6 +299,238 @@ class ProcessExecutor implements ReleaserPropertiesAware { } +class CommandPicker { + + private static final Log log = LogFactory.getLog(CommandPicker.class); + + private final ReleaserProperties releaserProperties; + + private final ProjectType projectType; + + CommandPicker(ReleaserProperties releaserProperties, String projectRoot) { + this.releaserProperties = releaserProperties; + this.projectType = guessProjectType(projectRoot); + } + + CommandPicker(ReleaserProperties releaserProperties) { + this.releaserProperties = releaserProperties; + String projectRoot = releaserProperties.getWorkingDir(); + this.projectType = guessProjectType(projectRoot); + } + + private ProjectType guessProjectType(String projectRoot) { + if (new File(projectRoot, "pom.xml").exists()) { + return ProjectType.MAVEN; + } + else if (new File(projectRoot, "build.gradle").exists()) { + return ProjectType.GRADLE; + } + return ProjectType.BASH; + } + + String systemProperties() { + if (projectType == ProjectType.GRADLE) { + return releaserProperties.getGradle().getSystemProperties(); + } + else if (projectType == ProjectType.MAVEN) { + return releaserProperties.getMaven().getSystemProperties(); + } + return releaserProperties.getBash().getSystemProperties(); + } + + public String[] publishDocsCommands() { + if (projectType == ProjectType.GRADLE) { + return releaserProperties.getGradle().getPublishDocsCommands(); + } + else if (projectType == ProjectType.MAVEN) { + return releaserProperties.getMaven().getPublishDocsCommands(); + } + return releaserProperties.getBash().getPublishDocsCommands(); + } + + String systemPropertiesPlaceholder() { + if (projectType == ProjectType.GRADLE) { + return ReleaserProperties.Gradle.SYSTEM_PROPS_PLACEHOLDER; + } + else if (projectType == ProjectType.MAVEN) { + return ReleaserProperties.Maven.SYSTEM_PROPS_PLACEHOLDER; + } + return ReleaserProperties.Bash.SYSTEM_PROPS_PLACEHOLDER; + } + + String buildCommand(ProjectVersion version) { + if (projectType == ProjectType.GRADLE) { + return gradleCommandWithSystemProps( + releaserProperties.getGradle().getBuildCommand()); + } + else if (projectType == ProjectType.MAVEN) { + return mavenCommandWithSystemProps( + releaserProperties.getMaven().getBuildCommand(), version); + } + return bashCommandWithSystemProps(releaserProperties.getBash().getBuildCommand()); + } + + String version() { + // makes more sense to use PomReader + if (projectType == ProjectType.GRADLE) { + return "./gradlew properties | grep version: | awk '{print $2}'"; + } + return "./mvnw -q" + " -Dexec.executable=\"echo\"" + + " -Dexec.args=\"\\${project.version}\"" + " --non-recursive" + + " org.codehaus.mojo:exec-maven-plugin:1.3.1:exec | tail -1"; + } + + String groupId() { + // makes more sense to use PomReader + if (projectType == ProjectType.GRADLE) { + return "./gradlew groupId | tail -1"; + } + return "./mvnw -q" + " -Dexec.executable=\"echo\"" + + " -Dexec.args=\"\\${project.groupId}\"" + " --non-recursive" + + " org.codehaus.mojo:exec-maven-plugin:1.3.1:exec | tail -1"; + } + + String generateReleaseTrainDocsCommand(ProjectVersion version) { + if (projectType == ProjectType.GRADLE) { + return gradleCommandWithSystemProps( + releaserProperties.getGradle().getGenerateReleaseTrainDocsCommand()); + } + else if (projectType == ProjectType.MAVEN) { + return mavenCommandWithSystemProps( + releaserProperties.getMaven().getGenerateReleaseTrainDocsCommand(), + version); + } + return bashCommandWithSystemProps( + releaserProperties.getBash().getGenerateReleaseTrainDocsCommand()); + } + + String deployCommand(ProjectVersion version) { + if (projectType == ProjectType.GRADLE) { + return gradleCommandWithSystemProps( + releaserProperties.getGradle().getDeployCommand()); + } + else if (projectType == ProjectType.MAVEN) { + return mavenCommandWithSystemProps( + releaserProperties.getMaven().getDeployCommand(), version); + } + return bashCommandWithSystemProps( + releaserProperties.getBash().getDeployCommand()); + } + + String deployGuidesCommand(ProjectVersion version) { + if (projectType == ProjectType.GRADLE) { + return gradleCommandWithSystemProps( + releaserProperties.getGradle().getDeployGuidesCommand()); + } + else if (projectType == ProjectType.MAVEN) { + return mavenCommandWithSystemProps( + releaserProperties.getMaven().getDeployGuidesCommand(), version, + MavenProfile.GUIDES, MavenProfile.INTEGRATION); + } + return bashCommandWithSystemProps( + releaserProperties.getBash().getDeployGuidesCommand()); + } + + long waitTimeInMinutes() { + if (projectType == ProjectType.GRADLE) { + return releaserProperties.getGradle().getWaitTimeInMinutes(); + } + else if (projectType == ProjectType.MAVEN) { + return releaserProperties.getMaven().getWaitTimeInMinutes(); + } + return releaserProperties.getBash().getWaitTimeInMinutes(); + } + + private String gradleCommandWithSystemProps(String command) { + if (command.contains(ReleaserProperties.Gradle.SYSTEM_PROPS_PLACEHOLDER)) { + return command; + } + return command + " " + ReleaserProperties.Maven.SYSTEM_PROPS_PLACEHOLDER; + } + + private String mavenCommandWithSystemProps(String command, ProjectVersion version, + MavenProfile... profiles) { + if (command.contains(ReleaserProperties.Maven.SYSTEM_PROPS_PLACEHOLDER)) { + return appendMavenProfile(command, version, profiles); + } + return appendMavenProfile(command, version, profiles) + " " + + ReleaserProperties.Maven.SYSTEM_PROPS_PLACEHOLDER; + } + + private String bashCommandWithSystemProps(String command) { + if (command.contains(ReleaserProperties.Maven.SYSTEM_PROPS_PLACEHOLDER)) { + return command; + } + return command + " " + ReleaserProperties.Maven.SYSTEM_PROPS_PLACEHOLDER; + } + + private String appendMavenProfile(String command, ProjectVersion version, + MavenProfile... profiles) { + String trimmedCommand = command.trim(); + if (version.isMilestone() || version.isRc()) { + log.info("Adding the milestone profile to the Maven build"); + return trimmedCommand + " " + MavenProfile.MILESTONE.asMavenProfile() + + profilesToString(profiles); + } + else if (version.isRelease() || version.isServiceRelease()) { + log.info("Adding the central profile to the Maven build"); + return trimmedCommand + " " + MavenProfile.CENTRAL.asMavenProfile() + + profilesToString(profiles); + } + else { + log.info("The build is a snapshot one - will not add any profiles"); + } + return trimmedCommand; + } + + private String profilesToString(MavenProfile... profiles) { + return Arrays.stream(profiles).map(profile -> "-P" + profile) + .collect(Collectors.joining(" ")); + } + + private enum ProjectType { + + MAVEN, GRADLE, BASH; + + } + + /** + * Enumeration over commonly used Maven profiles. + */ + private enum MavenProfile { + + /** + * Profile used for milestone versions. + */ + MILESTONE, + + /** + * Profile used for ga versions. + */ + CENTRAL, + + /** + * Profile used to run integration tests. + */ + INTEGRATION, + + /** + * Profile used to run guides publishing. + */ + GUIDES; + + /** + * Converts the profile to lowercase, maven command line property. + * @return profile with prepended -P + */ + public String asMavenProfile() { + return "-P" + this.name().toLowerCase(); + } + + } + +} + class HtmlFileWalker extends SimpleFileVisitor { private static final String HTML_EXTENSION = ".html"; diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/ProjectVersion.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/ProjectVersion.java similarity index 89% rename from spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/ProjectVersion.java rename to spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/ProjectVersion.java index 9d5c8273..7dc57493 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/ProjectVersion.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/ProjectVersion.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.release.internal.pom; +package org.springframework.cloud.release.internal.project; import java.io.File; import java.util.Arrays; @@ -25,6 +25,7 @@ import java.util.regex.Pattern; import org.apache.maven.model.Model; +import org.springframework.cloud.release.internal.tech.PomReader; import org.springframework.util.StringUtils; /** @@ -60,27 +61,40 @@ public class ProjectVersion implements Comparable { */ public final String version; - private final Model model; + private final String groupId; + + private final String artifactId; public ProjectVersion(String projectName, String version) { - this.projectName = nameWithoutParent(projectName); + this.projectName = projectName; this.version = version; - this.model = null; + this.groupId = ""; + this.artifactId = ""; } public ProjectVersion(File project) { if (new File(project, "build.gradle").exists()) { - ProjectVersion projectVersion = notMavenProject(project); + ProjectVersion projectVersion = gradleProject(project); this.projectName = projectVersion.projectName; this.version = projectVersion.version; - this.model = null; + this.groupId = new ProjectCommandExecutor().groupId(); + this.artifactId = projectName; } else { - PomReader pomReader = new PomReader(); - Model model = pomReader.readPom(project); - this.projectName = nameWithoutParent(model.getArtifactId()); - this.version = model.getVersion(); - this.model = model; + Model model = PomReader.readPom(project); + if (model != null) { + this.projectName = nameWithoutParent(model.getArtifactId()); + this.version = model.getVersion(); + this.groupId = groupId(model); + this.artifactId = model.getArtifactId(); + } + else { + ProjectVersion projectVersion = notMavenProject(project); + this.projectName = projectVersion.projectName; + this.version = projectVersion.version; + this.groupId = projectVersion.groupId; + this.artifactId = projectVersion.artifactId; + } } } @@ -91,6 +105,13 @@ public class ProjectVersion implements Comparable { return new ProjectVersion(nameWithoutParent(name), version); } + public static ProjectVersion gradleProject(File file) { + File parentFolder = file.getParentFile() != null ? file.getParentFile() : file; + String name = parentFolder.getName(); + String version = new ProjectCommandExecutor().version(); + return new ProjectVersion(nameWithoutParent(name), version); + } + private static String nameWithoutParent(String projectName) { boolean containsParent = projectName.endsWith("-parent"); if (!containsParent) { @@ -99,6 +120,20 @@ public class ProjectVersion implements Comparable { return projectName.substring(0, projectName.indexOf("-parent")); } + private String groupId(Model model) { + if (model == null) { + return ""; + } + if (StringUtils.hasText(model.getGroupId())) { + return model.getGroupId(); + } + if (model.getParent() != null + && StringUtils.hasText(model.getParent().getGroupId())) { + return model.getParent().getGroupId(); + } + return ""; + } + public String bumpedVersion() { return bumpedVersion(assertVersion()).print(); } @@ -192,17 +227,7 @@ public class ProjectVersion implements Comparable { } public String groupId() { - if (this.model == null) { - return ""; - } - if (StringUtils.hasText(this.model.getGroupId())) { - return this.model.getGroupId(); - } - if (this.model.getParent() != null - && StringUtils.hasText(this.model.getParent().getGroupId())) { - return this.model.getParent().getGroupId(); - } - return ""; + return this.groupId; } public boolean isValid() { @@ -363,13 +388,6 @@ public class ProjectVersion implements Comparable { assertIfValid(); } - private void assertIfValid() { - if (isInvalid()) { - throw new IllegalStateException( - "Version is invalid. Should be of format [1.2.3.A] / [1.2.3-A] or [A.B] / [A-B]"); - } - } - // Hoxton.RELEASE // Hoxton-RELEASE private SplitVersion(String major, String delimiter, String suffix) { @@ -385,6 +403,39 @@ public class ProjectVersion implements Comparable { assertIfValid(); } + private static String orDefault(String[] args, int argIndex) { + return args.length > argIndex ? args[argIndex] : ""; + } + + static SplitVersion hyphen(String major, String suffix) { + return new SplitVersion(major, HYPHEN, suffix); + } + + static SplitVersion hyphen(String[] args) { + return version(args, HYPHEN); + } + + static SplitVersion dot(String[] args) { + return version(args, DOT); + } + + private static SplitVersion version(String[] args, String delimiter) { + if (args.length == 2) { + return new SplitVersion(args[0], "", "", delimiter, args[1]); + } + else if (args.length == 3) { + return new SplitVersion(args[0], args[1], "", delimiter, args[2]); + } + return new SplitVersion(args, delimiter); + } + + private void assertIfValid() { + if (isInvalid()) { + throw new IllegalStateException( + "Version is invalid. Should be of format [1.2.3.A] / [1.2.3-A] or [A.B] / [A-B]"); + } + } + private boolean isInvalid() { return wrongReleaseTrainVersion() || wrongLibraryVersion() || wrongDelimiter() || noSuffix(); @@ -442,32 +493,6 @@ public class ProjectVersion implements Comparable { BUILD_SNAPSHOT_SUFFIX); } - private static String orDefault(String[] args, int argIndex) { - return args.length > argIndex ? args[argIndex] : ""; - } - - static SplitVersion hyphen(String major, String suffix) { - return new SplitVersion(major, HYPHEN, suffix); - } - - static SplitVersion hyphen(String[] args) { - return version(args, HYPHEN); - } - - static SplitVersion dot(String[] args) { - return version(args, DOT); - } - - private static SplitVersion version(String[] args, String delimiter) { - if (args.length == 2) { - return new SplitVersion(args[0], "", "", delimiter, args[1]); - } - else if (args.length == 3) { - return new SplitVersion(args[0], args[1], "", delimiter, args[2]); - } - return new SplitVersion(args, delimiter); - } - } } diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/Projects.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/Projects.java similarity index 95% rename from spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/Projects.java rename to spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/Projects.java index b082caf8..5c1811fc 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/Projects.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/Projects.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.release.internal.pom; +package org.springframework.cloud.release.internal.project; import java.io.File; import java.util.Arrays; @@ -151,6 +151,11 @@ public class Projects extends HashSet { .collect(Collectors.joining(",")); } + public Set asProjects() { + return this.stream().map(projectVersion -> new Project(projectVersion.projectName, + projectVersion.version)).collect(Collectors.toSet()); + } + @Override public String toString() { return stream().map(v -> "[" + v.projectName + "=>" + v.version + "]") diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/SaganUpdater.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/SaganUpdater.java index d11d8e87..bb11fd38 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/SaganUpdater.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/sagan/SaganUpdater.java @@ -28,7 +28,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.release.internal.ReleaserProperties; -import org.springframework.cloud.release.internal.pom.ProjectVersion; +import org.springframework.cloud.release.internal.project.ProjectVersion; import org.springframework.util.StringUtils; /** diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/PomReader.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/tech/PomReader.java similarity index 71% rename from spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/PomReader.java rename to spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/tech/PomReader.java index 4b16b32e..e7e6e0ba 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/PomReader.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/tech/PomReader.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.release.internal.pom; +package org.springframework.cloud.release.internal.tech; import java.io.File; import java.io.FileReader; @@ -27,14 +27,22 @@ import org.apache.maven.model.io.xpp3.MavenXpp3Reader; import org.codehaus.plexus.util.xml.pull.XmlPullParserException; /** + * Class that reads poms as {@link Model}. + * * @author Marcin Grzejszczak */ -class PomReader { +public final class PomReader { + + private PomReader() { + throw new IllegalStateException("Shouldn't instantiate a utility class"); + } /** * Returns a parsed POM. + * @param file location to the pom + * @return parsed model */ - Model readPom(File file) { + public static Model readPom(File file) { File pom = file; if (file.isDirectory()) { pom = new File(file, "pom.xml"); @@ -60,4 +68,15 @@ class PomReader { } } + public static Model pom(File projectRoot, String pom) { + if (pom == null) { + throw new IllegalStateException("Pom is not present"); + } + File pomFile = new File(projectRoot, pom); + if (!pomFile.exists()) { + throw new IllegalStateException("Pom is not present"); + } + return PomReader.readPom(pomFile); + } + } diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/template/BlogTemplateGenerator.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/template/BlogTemplateGenerator.java index 3b068f50..e8170dad 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/template/BlogTemplateGenerator.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/template/BlogTemplateGenerator.java @@ -27,8 +27,8 @@ import com.google.common.collect.ImmutableMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.cloud.release.internal.git.ProjectGitHandler; -import org.springframework.cloud.release.internal.pom.Projects; +import org.springframework.cloud.release.internal.github.ProjectGitHubHandler; +import org.springframework.cloud.release.internal.project.Projects; /** * @author Marcin Grzejszczak @@ -55,7 +55,7 @@ class BlogTemplateGenerator { private final NotesGenerator notesGenerator; BlogTemplateGenerator(Template template, String releaseVersion, File blogOutput, - Projects projects, ProjectGitHandler handler) { + Projects projects, ProjectGitHubHandler handler) { this.template = template; this.releaseVersion = releaseVersion; this.blogOutput = blogOutput; diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/template/NotesGenerator.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/template/NotesGenerator.java index 71208c2d..83c83913 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/template/NotesGenerator.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/template/NotesGenerator.java @@ -20,8 +20,8 @@ import java.util.Arrays; import java.util.Set; import java.util.stream.Collectors; -import org.springframework.cloud.release.internal.git.ProjectGitHandler; -import org.springframework.cloud.release.internal.pom.Projects; +import org.springframework.cloud.release.internal.github.ProjectGitHubHandler; +import org.springframework.cloud.release.internal.project.Projects; import org.springframework.util.StringUtils; /** @@ -29,9 +29,9 @@ import org.springframework.util.StringUtils; */ class NotesGenerator { - private final ProjectGitHandler handler; + private final ProjectGitHubHandler handler; - NotesGenerator(ProjectGitHandler handler) { + NotesGenerator(ProjectGitHubHandler handler) { this.handler = handler; } diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/template/ReleaseNotesTemplateGenerator.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/template/ReleaseNotesTemplateGenerator.java index 206a5109..ebb30bfe 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/template/ReleaseNotesTemplateGenerator.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/template/ReleaseNotesTemplateGenerator.java @@ -25,20 +25,15 @@ import java.util.Map; import com.github.jknack.handlebars.Template; import com.google.common.collect.ImmutableMap; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.cloud.release.internal.git.ProjectGitHandler; -import org.springframework.cloud.release.internal.pom.Projects; +import org.springframework.cloud.release.internal.github.ProjectGitHubHandler; +import org.springframework.cloud.release.internal.project.Projects; /** * @author Marcin Grzejszczak */ class ReleaseNotesTemplateGenerator { - private static final Logger log = LoggerFactory - .getLogger(ReleaseNotesTemplateGenerator.class); - private final Template template; private final String releaseVersion; @@ -50,7 +45,7 @@ class ReleaseNotesTemplateGenerator { private final NotesGenerator notesGenerator; ReleaseNotesTemplateGenerator(Template template, String releaseVersion, - File blogOutput, Projects projects, ProjectGitHandler handler) { + File blogOutput, Projects projects, ProjectGitHubHandler handler) { this.template = template; this.releaseVersion = releaseVersion; this.blogOutput = blogOutput; diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/template/TemplateGenerator.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/template/TemplateGenerator.java index 70db2400..dce216dc 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/template/TemplateGenerator.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/template/TemplateGenerator.java @@ -23,8 +23,8 @@ import com.github.jknack.handlebars.Template; import org.springframework.cloud.release.internal.ReleaserProperties; import org.springframework.cloud.release.internal.ReleaserPropertiesAware; -import org.springframework.cloud.release.internal.git.ProjectGitHandler; -import org.springframework.cloud.release.internal.pom.Projects; +import org.springframework.cloud.release.internal.github.ProjectGitHubHandler; +import org.springframework.cloud.release.internal.project.Projects; import org.springframework.cloud.release.internal.tech.HandlebarsHelper; /** @@ -48,11 +48,11 @@ public class TemplateGenerator implements ReleaserPropertiesAware { private final File releaseNotesOutput; - private final ProjectGitHandler handler; + private final ProjectGitHubHandler handler; private ReleaserProperties props; - public TemplateGenerator(ReleaserProperties props, ProjectGitHandler handler) { + public TemplateGenerator(ReleaserProperties props, ProjectGitHubHandler handler) { this.props = props; this.handler = handler; this.emailOutput = new File("target/email.txt"); @@ -61,7 +61,8 @@ public class TemplateGenerator implements ReleaserPropertiesAware { this.releaseNotesOutput = new File("target/notes.md"); } - TemplateGenerator(ReleaserProperties props, File output, ProjectGitHandler handler) { + TemplateGenerator(ReleaserProperties props, File output, + ProjectGitHubHandler handler) { this.props = props; this.emailOutput = output; this.blogOutput = output; diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/versions/VersionsFetcher.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/versions/VersionsFetcher.java index 4787a79a..7a2093db 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/versions/VersionsFetcher.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/versions/VersionsFetcher.java @@ -38,9 +38,9 @@ import org.springframework.boot.context.properties.bind.Binder; import org.springframework.boot.context.properties.source.MapConfigurationPropertySource; import org.springframework.cloud.release.internal.ReleaserProperties; import org.springframework.cloud.release.internal.ReleaserPropertiesAware; -import org.springframework.cloud.release.internal.pom.ProjectPomUpdater; -import org.springframework.cloud.release.internal.pom.ProjectVersion; -import org.springframework.cloud.release.internal.pom.Projects; +import org.springframework.cloud.release.internal.buildsystem.ProjectPomUpdater; +import org.springframework.cloud.release.internal.project.ProjectVersion; +import org.springframework.cloud.release.internal.project.Projects; import org.springframework.core.io.InputStreamResource; import org.springframework.util.StringUtils; @@ -54,12 +54,12 @@ public class VersionsFetcher implements ReleaserPropertiesAware { private static final Logger log = LoggerFactory.getLogger(VersionsFetcher.class); - private ReleaserProperties properties; - private final ProjectPomUpdater projectPomUpdater; private final ToPropertiesConverter toPropertiesConverter; + private ReleaserProperties properties; + public VersionsFetcher(ReleaserProperties properties, ProjectPomUpdater projectPomUpdater) { this.properties = properties; diff --git a/spring-cloud-release-tools-core/src/main/resources/templates/cloud/blog.hbs b/spring-cloud-release-tools-core/src/main/resources/templates/cloud/blog.hbs index 6777775a..d3aff91c 100644 --- a/spring-cloud-release-tools-core/src/main/resources/templates/cloud/blog.hbs +++ b/spring-cloud-release-tools-core/src/main/resources/templates/cloud/blog.hbs @@ -2,16 +2,17 @@ On behalf of the community, I am pleased to announce that the {{ availability }} ## Notable Changes in the {{ releaseName }} Release Train {{#each projects}} -### {{ name }} + ### {{ name }} -Some text related to project + Some text related to project {{/each}} The following modules were updated as part of {{ releaseVersion }}: -| Module | Version | Issues -|--- |--- |--- |--- -{{#each projects}}| {{name}} | {{version}} | {{#if closedMilestoneUrl}}([issues]({{{ closedMilestoneUrl }}})){{/if}}{{^closedMilestoneUrl}} {{/closedMilestoneUrl}} +| Module | Version | Issues +|--- |--- |--- |--- +{{#each projects}}| {{name}} | {{version}} | {{#if + closedMilestoneUrl}}([issues]({{{ closedMilestoneUrl }}})){{/if}}{{^closedMilestoneUrl}} {{/closedMilestoneUrl}} {{/each}} As always, we welcome feedback on [GitHub](https://github.com/spring-cloud/), on [Gitter](https://gitter.im/spring-cloud/spring-cloud), on [Stack Overflow](https://stackoverflow.com/questions/tagged/spring-cloud), or on [Twitter](https://twitter.com/SpringCloud). @@ -19,16 +20,17 @@ As always, we welcome feedback on [GitHub](https://github.com/spring-cloud/), on To get started with Maven with a BOM (dependency management only): ``` -{{#if nonRelease}} - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - -{{/if}} +{{#if nonRelease}} + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + {{/if}} @@ -57,28 +59,28 @@ or with Gradle: ``` buildscript { - dependencies { - classpath "io.spring.gradle:dependency-management-plugin:1.0.2.RELEASE" - } +dependencies { +classpath "io.spring.gradle:dependency-management-plugin:1.0.2.RELEASE" +} } {{#if nonRelease}}repositories { - maven { - url 'https://repo.spring.io/milestone' - } +maven { +url 'https://repo.spring.io/milestone' +} }{{/if}} apply plugin: "io.spring.dependency-management" dependencyManagement { - imports { - mavenBom 'org.springframework.cloud:spring-cloud-dependencies:{{ releaseVersion }}' - } +imports { +mavenBom 'org.springframework.cloud:spring-cloud-dependencies:{{ releaseVersion }}' +} } dependencies { - compile 'org.springframework.cloud:spring-cloud-starter-config' - compile 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' - ... +compile 'org.springframework.cloud:spring-cloud-starter-config' +compile 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' +... } ``` diff --git a/spring-cloud-release-tools-core/src/main/resources/templates/cloud/spring-project.hbs b/spring-cloud-release-tools-core/src/main/resources/templates/cloud/spring-project.hbs index b59e2769..6e45b488 100644 --- a/spring-cloud-release-tools-core/src/main/resources/templates/cloud/spring-project.hbs +++ b/spring-cloud-release-tools-core/src/main/resources/templates/cloud/spring-project.hbs @@ -5,15 +5,15 @@ title: Spring Cloud badges: - # Customize your project's badges. Delete any entries that do not apply. - custom: - - name: Source (GitHub) - url: https://github.com/spring-cloud - icon: github +# Customize your project's badges. Delete any entries that do not apply. +custom: +- name: Source (GitHub) +url: https://github.com/spring-cloud +icon: github - - name: StackOverflow - url: https://stackoverflow.com/questions/tagged/spring-cloud - icon: stackoverflow +- name: StackOverflow +url: https://stackoverflow.com/questions/tagged/spring-cloud +icon: stackoverflow --- @@ -42,7 +42,7 @@ Spring Cloud builds on Spring Boot by providing a bunch of libraries that enhance the behaviour of an application when added to the classpath. You can take advantage of the basic default behaviour to get started really quickly, and then when you need to, you can -configure or extend to create a custom solution. +configure or extend to create a custom solution. @@ -59,7 +59,8 @@ and eureka (change the artifact ids to pull in other starters): ## Features -Spring Cloud focuses on providing good out of box experience for typical use cases and extensibility mechanism to cover others. +Spring Cloud focuses on providing good out of box experience for typical use cases and extensibility mechanism to cover +others. * Distributed/versioned configuration * Service registration and discovery @@ -79,9 +80,9 @@ annotation. Example application that is a discovery client: @SpringBootApplication @EnableDiscoveryClient public class Application { - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } +public static void main(String[] args) { +SpringApplication.run(Application.class, args); +} } ``` @@ -91,119 +92,160 @@ public class Application { {% capture project_description %} -Centralized external configuration management backed by a git repository. The configuration resources map directly to Spring `Environment` but could be used by non-Spring applications if desired. +Centralized external configuration management backed by a git repository. The configuration resources map directly to +Spring `Environment` but could be used by non-Spring applications if desired. {% endcapture %} -{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-config" repo_url="https://github.com/spring-cloud/spring-cloud-config" project_title="Spring Cloud Config" project_description=project_description %} +{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-config" +repo_url="https://github.com/spring-cloud/spring-cloud-config" project_title="Spring Cloud Config" +project_description=project_description %} {% capture project_description %} Integration with various Netflix OSS components (Eureka, Hystrix, Zuul, Archaius, etc.). {% endcapture %} -{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-netflix" repo_url="https://github.com/spring-cloud/spring-cloud-netflix" project_title="Spring Cloud Netflix" project_description=project_description %} +{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-netflix" +repo_url="https://github.com/spring-cloud/spring-cloud-netflix" project_title="Spring Cloud Netflix" +project_description=project_description %} {% capture project_description %} -An event bus for linking services and service instances together with distributed messaging. Useful for propagating state changes across a cluster (e.g. config change events). +An event bus for linking services and service instances together with distributed messaging. Useful for propagating +state changes across a cluster (e.g. config change events). {% endcapture %} -{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-bus" repo_url="https://github.com/spring-cloud/spring-cloud-bus" project_title="Spring Cloud Bus" project_description=project_description %} +{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-bus" +repo_url="https://github.com/spring-cloud/spring-cloud-bus" project_title="Spring Cloud Bus" +project_description=project_description %} {% capture project_description %} -Integrates your application with Pivotal Cloud Foundry. Provides a service discovery implementation and also makes it easy to implement SSO and OAuth2 protected resources. +Integrates your application with Pivotal Cloud Foundry. Provides a service discovery implementation and also makes it +easy to implement SSO and OAuth2 protected resources. {% endcapture %} -{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-cloudfoundry" repo_url="https://github.com/spring-cloud/spring-cloud-cloudfoundry" project_title="Spring Cloud for Cloud Foundry" project_description=project_description %} +{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-cloudfoundry" +repo_url="https://github.com/spring-cloud/spring-cloud-cloudfoundry" project_title="Spring Cloud for Cloud Foundry" +project_description=project_description %} {% capture project_description %} Provides a starting point for building a service broker that implements the Open Service Broker API. {% endcapture %} -{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-open-service-broker/" repo_url="https://github.com/spring-cloud/spring-cloud-open-service-broker" project_title="Spring Cloud Open Service Broker" project_description=project_description %} +{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-open-service-broker/" +repo_url="https://github.com/spring-cloud/spring-cloud-open-service-broker" project_title="Spring Cloud Open Service +Broker" project_description=project_description %} {% capture project_description %} -Leadership election and common stateful patterns with an abstraction and implementation for Zookeeper, Redis, Hazelcast, Consul. +Leadership election and common stateful patterns with an abstraction and implementation for Zookeeper, Redis, Hazelcast, +Consul. {% endcapture %} -{% include project_block.md site_url="/spring-cloud" repo_url="https://github.com/spring-cloud/spring-cloud-cluster" project_title="Spring Cloud Cluster" project_description=project_description %} +{% include project_block.md site_url="/spring-cloud" repo_url="https://github.com/spring-cloud/spring-cloud-cluster" +project_title="Spring Cloud Cluster" project_description=project_description %} {% capture project_description %} Service discovery and configuration management with Hashicorp Consul. {% endcapture %} -{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-consul" repo_url="https://github.com/spring-cloud/spring-cloud-consul" project_title="Spring Cloud Consul" project_description=project_description %} +{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-consul" +repo_url="https://github.com/spring-cloud/spring-cloud-consul" project_title="Spring Cloud Consul" +project_description=project_description %} {% capture project_description %} Provides support for load-balanced OAuth2 rest client and authentication header relays in a Zuul proxy. {% endcapture %} -{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-security" repo_url="https://github.com/spring-cloud/spring-cloud-security" project_title="Spring Cloud Security" project_description=project_description %} +{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-security" +repo_url="https://github.com/spring-cloud/spring-cloud-security" project_title="Spring Cloud Security" +project_description=project_description %} {% capture project_description %} Distributed tracing for Spring Cloud applications, compatible with Zipkin, HTrace and log-based (e.g. ELK) tracing. {% endcapture %} -{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-sleuth" repo_url="https://github.com/spring-cloud/spring-cloud-sleuth" project_title="Spring Cloud Sleuth" project_description=project_description %} +{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-sleuth" +repo_url="https://github.com/spring-cloud/spring-cloud-sleuth" project_title="Spring Cloud Sleuth" +project_description=project_description %} {% capture project_description %} -A cloud-native orchestration service for composable microservice applications on modern runtimes. Easy-to-use DSL, drag-and-drop GUI, and REST-APIs together simplifies the overall orchestration of microservice based data pipelines. +A cloud-native orchestration service for composable microservice applications on modern runtimes. Easy-to-use DSL, +drag-and-drop GUI, and REST-APIs together simplifies the overall orchestration of microservice based data pipelines. {% endcapture %} -{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-dataflow" repo_url="https://github.com/spring-cloud/spring-cloud-dataflow" project_title="Spring Cloud Data Flow" project_description=project_description %} +{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-dataflow" +repo_url="https://github.com/spring-cloud/spring-cloud-dataflow" project_title="Spring Cloud Data Flow" +project_description=project_description %} {% capture project_description %} -A lightweight event-driven microservices framework to quickly build applications that can connect to external systems. Simple declarative model to send and receive messages using Apache Kafka or RabbitMQ between Spring Boot apps. +A lightweight event-driven microservices framework to quickly build applications that can connect to external systems. +Simple declarative model to send and receive messages using Apache Kafka or RabbitMQ between Spring Boot apps. {% endcapture %} -{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-stream" repo_url="https://github.com/spring-cloud/spring-cloud-stream" project_title="Spring Cloud Stream" project_description=project_description %} +{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-stream" +repo_url="https://github.com/spring-cloud/spring-cloud-stream" project_title="Spring Cloud Stream" +project_description=project_description %} {% capture project_description %} -Spring Cloud Stream App Starters are Spring Boot based Spring Integration applications that provide integration with external systems. +Spring Cloud Stream App Starters are Spring Boot based Spring Integration applications that provide integration with +external systems. {% endcapture %} -{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-stream-app-starters" repo_url="https://github.com/spring-cloud/spring-cloud-stream-app-starters" project_title="Spring Cloud Stream App Starters" project_description=project_description %} +{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-stream-app-starters" +repo_url="https://github.com/spring-cloud/spring-cloud-stream-app-starters" project_title="Spring Cloud Stream App +Starters" project_description=project_description %} {% capture project_description %} -A short-lived microservices framework to quickly build applications that perform finite amounts of data processing. Simple declarative for adding both functional and non-functional features to Spring Boot apps. +A short-lived microservices framework to quickly build applications that perform finite amounts of data processing. +Simple declarative for adding both functional and non-functional features to Spring Boot apps. {% endcapture %} -{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-task" repo_url="https://github.com/spring-cloud/spring-cloud-task" project_title="Spring Cloud Task" project_description=project_description %} +{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-task" +repo_url="https://github.com/spring-cloud/spring-cloud-task" project_title="Spring Cloud Task" +project_description=project_description %} {% capture project_description %} -Spring Cloud Task App Starters are Spring Boot applications that may be any process including Spring Batch jobs that do not run forever, and they end/stop after a finite period of data processing. +Spring Cloud Task App Starters are Spring Boot applications that may be any process including Spring Batch jobs that do +not run forever, and they end/stop after a finite period of data processing. {% endcapture %} -{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-task-app-starters" repo_url="https://github.com/spring-cloud/spring-cloud-task-app-starters" project_title="Spring Cloud Task App Starters" project_description=project_description %} +{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-task-app-starters" +repo_url="https://github.com/spring-cloud/spring-cloud-task-app-starters" project_title="Spring Cloud Task App Starters" +project_description=project_description %} {% capture project_description %} Service discovery and configuration management with Apache Zookeeper. {% endcapture %} -{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-zookeeper" repo_url="https://github.com/spring-cloud/spring-cloud-zookeeper" project_title="Spring Cloud Zookeeper" project_description=project_description %} +{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-zookeeper" +repo_url="https://github.com/spring-cloud/spring-cloud-zookeeper" project_title="Spring Cloud Zookeeper" +project_description=project_description %} {% capture project_description %} -Easy integration with hosted Amazon Web Services. It offers a convenient way to interact with AWS provided services using well-known Spring idioms and APIs, such as the messaging or caching API. Developers can build their application around the hosted services without having to care about infrastructure or maintenance. +Easy integration with hosted Amazon Web Services. It offers a convenient way to interact with AWS provided services +using well-known Spring idioms and APIs, such as the messaging or caching API. Developers can build their application +around the hosted services without having to care about infrastructure or maintenance. {% endcapture %} {% capture site_url %} {{ site.projects_site_url }}/spring-cloud-aws {% endcapture %} -{% include project_block.md site_url=site_url repo_url="https://github.com/spring-cloud/spring-cloud-aws" project_title="Spring Cloud for Amazon Web Services" project_description=project_description %} +{% include project_block.md site_url=site_url repo_url="https://github.com/spring-cloud/spring-cloud-aws" +project_title="Spring Cloud for Amazon Web Services" project_description=project_description %} {% capture project_description %} @@ -215,57 +257,77 @@ databases and message brokers (the project formerly known as "Spring Cloud"). {{ site.projects_site_url }}/spring-cloud-connectors {% endcapture %} -{% include project_block.md site_url=site_url repo_url="https://github.com/spring-cloud/spring-cloud-connectors" project_title="Spring Cloud Connectors" project_description=project_description %} +{% include project_block.md site_url=site_url repo_url="https://github.com/spring-cloud/spring-cloud-connectors" +project_title="Spring Cloud Connectors" project_description=project_description %} {% capture project_description %} -Spring Boot-style starter projects to ease dependency management for consumers of Spring Cloud. (Discontinued as a project and merged with the other projects after Angel.SR2.) +Spring Boot-style starter projects to ease dependency management for consumers of Spring Cloud. (Discontinued as a +project and merged with the other projects after Angel.SR2.) {% endcapture %} -{% include project_block.md site_url="https://github.com/spring-cloud/spring-cloud-starters" repo_url="https://github.com/spring-cloud/spring-cloud-starters" project_title="Spring Cloud Starters" project_description=project_description %} +{% include project_block.md site_url="https://github.com/spring-cloud/spring-cloud-starters" +repo_url="https://github.com/spring-cloud/spring-cloud-starters" project_title="Spring Cloud Starters" +project_description=project_description %} {% capture project_description %} Spring Boot CLI plugin for creating Spring Cloud component applications quickly in Groovy {% endcapture %} -{% include project_block.md site_url="https://github.com/spring-cloud/spring-cloud-cli" repo_url="https://github.com/spring-cloud/spring-cloud-cli" project_title="Spring Cloud CLI" project_description=project_description %} - +{% include project_block.md site_url="https://github.com/spring-cloud/spring-cloud-cli" +repo_url="https://github.com/spring-cloud/spring-cloud-cli" project_title="Spring Cloud CLI" +project_description=project_description %} + {% capture project_description %} -Spring Cloud Contract is an umbrella project holding solutions that help users in successfully implementing the Consumer Driven Contracts approach. +Spring Cloud Contract is an umbrella project holding solutions that help users in successfully implementing the Consumer +Driven Contracts approach. {% endcapture %} -{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-contract" repo_url="https://github.com/spring-cloud/spring-cloud-contract" project_title="Spring Cloud Contract" project_description=project_description %} +{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-contract" +repo_url="https://github.com/spring-cloud/spring-cloud-contract" project_title="Spring Cloud Contract" +project_description=project_description %} {% capture project_description %} Spring Cloud Gateway is an intelligent and programmable router based on Project Reactor. {% endcapture %} -{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-gateway" repo_url="https://github.com/spring-cloud/spring-cloud-gateway" project_title="Spring Cloud Gateway" project_description=project_description %} +{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-gateway" +repo_url="https://github.com/spring-cloud/spring-cloud-gateway" project_title="Spring Cloud Gateway" +project_description=project_description %} {% capture project_description %} -Spring Cloud OpenFeign provides integrations for Spring Boot apps through autoconfiguration and binding to the Spring Environment and other Spring programming model idioms. +Spring Cloud OpenFeign provides integrations for Spring Boot apps through autoconfiguration and binding to the Spring +Environment and other Spring programming model idioms. {% endcapture %} -{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-openfeign" repo_url="https://github.com/spring-cloud/spring-cloud-openfeign" project_title="Spring Cloud OpenFeign" project_description=project_description %} +{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-openfeign" +repo_url="https://github.com/spring-cloud/spring-cloud-openfeign" project_title="Spring Cloud OpenFeign" +project_description=project_description %} {% capture project_description %} -Spring Cloud Pipelines provides an opinionated deployment pipeline with steps to ensure that your application can be deployed in zero downtime fashion and easilly rolled back of something goes wrong. +Spring Cloud Pipelines provides an opinionated deployment pipeline with steps to ensure that your application can be +deployed in zero downtime fashion and easilly rolled back of something goes wrong. {% endcapture %} -{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-pipelines" repo_url="https://github.com/spring-cloud/spring-cloud-pipelines" project_title="Spring Cloud Pipelines" project_description=project_description %} +{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-pipelines" +repo_url="https://github.com/spring-cloud/spring-cloud-pipelines" project_title="Spring Cloud Pipelines" +project_description=project_description %} {% capture project_description %} -Spring Cloud Function promotes the implementation of business logic via functions. It supports a uniform programming model across serverless providers, as well as the ability to run standalone (locally or in a PaaS). +Spring Cloud Function promotes the implementation of business logic via functions. It supports a uniform programming +model across serverless providers, as well as the ability to run standalone (locally or in a PaaS). {% endcapture %} -{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-function" repo_url="https://github.com/spring-cloud/spring-cloud-function" project_title="Spring Cloud Function" project_description=project_description %} - +{% include project_block.md site_url="https://cloud.spring.io/spring-cloud-function" +repo_url="https://github.com/spring-cloud/spring-cloud-function" project_title="Spring Cloud Function" +project_description=project_description %} + ## Release Trains Spring Cloud is an umbrella project consisting of independent projects with, in principle, different @@ -273,7 +335,7 @@ release cadences. To manage the portfolio a BOM (Bill of Materials) is published set of dependencies on the individual project (see below). The release trains have names, not versions, to avoid confusion with the sub-projects. The names are an alphabetic sequence (so you can sort them chronologically) with names of London Tube stations ("Angel" is the first -release, "Brixton" is the second). When point releases of the individual projects accumulate to +release, "Brixton" is the second). When point releases of the individual projects accumulate to a critical mass, or if there is a critical bug in one of them that needs to be available to everyone, the release train will push out "service releases" with names ending ".SRX", where "X" is a number. @@ -282,7 +344,7 @@ Release train contents: -|Component |{{lastGaTrainName}}|{{currentGaTrainName}}|{{currentSnapshotTrainName}}| +|Component |{{lastGaTrainName}}|{{currentGaTrainName}}|{{currentSnapshotTrainName}}| |--------------------------------------|-----------------|---------------------|------------------------| {{#each projects}} |{{componentName}}|{{lastGaVersion}}|{{currentGaVersion}}|{{currentSnapshotVersion}}| {{/each}} @@ -292,22 +354,26 @@ Release train contents: Finchley builds and works with Spring Boot 2.0.x, and is not expected to work with Spring Boot 1.5.x. -Note: The Dalston release train will [reach end-of-life](https://spring.io/blog/2018/06/19/spring-cloud-finchley-release-is-available) in December 2018. Edgware will follow the end-of-life cycle of Spring Boot 1.5.x. - +Note: The Dalston release train will [reach +end-of-life](https://spring.io/blog/2018/06/19/spring-cloud-finchley-release-is-available) in December 2018. Edgware +will follow the end-of-life cycle of Spring Boot 1.5.x. + The Dalston and Edgware release trains build on Spring Boot 1.5.x, and are not expected to work with Spring Boot 2.0.x. -NOTE: The Camden release train was [marked end-of-life](https://spring.io/blog/2018/06/19/spring-cloud-finchley-release-is-available). - +NOTE: The Camden release train was [marked +end-of-life](https://spring.io/blog/2018/06/19/spring-cloud-finchley-release-is-available). + The Camden release train builds on Spring Boot 1.4.x, but is also tested with 1.5.x. -NOTE: The Brixton and Angel release trains were [marked end-of-life](https://spring.io/blog/2017/07/21/spring-cloud-dalston-sr2-is-available-now#end-of-life-for-angel-and-brixton-release-trains) +NOTE: The Brixton and Angel release trains were [marked +end-of-life](https://spring.io/blog/2017/07/21/spring-cloud-dalston-sr2-is-available-now#end-of-life-for-angel-and-brixton-release-trains) (EOL) in July 2017. The Brixton release train builds on Spring Boot 1.3.x, but is also tested with 1.4.x. - + The Angel release train builds on Spring Boot 1.2.x, and is incompatible in some areas with Spring Boot 1.3.x. Brixton builds on Spring Boot 1.3.x and is similarly incompatible with 1.2.x. Some @@ -335,8 +401,9 @@ Spring dependency management plugin. > Spring Cloud. The opposite is not true: using the Cloud parent > makes it impossible, or at least unreliable, to also use the > Boot BOM to change the version of Spring Boot and its dependencies. - -> NOTE: If you find anything wrong or outdated on this page, please open an issue in [this](https://github.com/spring-projects/spring-cloud) repo. + +> NOTE: If you find anything wrong or outdated on this page, please open an issue in +[this](https://github.com/spring-projects/spring-cloud) repo. {% endcapture %} diff --git a/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/pom/TestPomReader.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/cloud/buildsystem/SpringCloudMavenBomParserAccessor.java similarity index 68% rename from spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/pom/TestPomReader.java rename to spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/cloud/buildsystem/SpringCloudMavenBomParserAccessor.java index d4d09a4d..606623fe 100644 --- a/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/pom/TestPomReader.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/cloud/buildsystem/SpringCloudMavenBomParserAccessor.java @@ -14,21 +14,14 @@ * limitations under the License. */ -package org.springframework.cloud.release.internal.pom; +package org.springframework.cloud.release.cloud.buildsystem; -import java.io.File; +import org.springframework.cloud.release.internal.buildsystem.CustomBomParser; -import org.apache.maven.model.Model; +public class SpringCloudMavenBomParserAccessor { -/** - * @author Marcin Grzejszczak - */ -public class TestPomReader { - - PomReader pomReader = new PomReader(); - - public Model readPom(File pom) { - return this.pomReader.readPom(pom); + public static CustomBomParser cloud() { + return new SpringCloudMavenBomParser(); } } diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/docs/ProjectDocumentationUpdaterTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/cloud/docs/SpringCloudCustomProjectDocumentationUpdaterTests.java similarity index 65% rename from spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/docs/ProjectDocumentationUpdaterTests.java rename to spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/cloud/docs/SpringCloudCustomProjectDocumentationUpdaterTests.java index ef72e268..34143644 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/docs/ProjectDocumentationUpdaterTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/cloud/docs/SpringCloudCustomProjectDocumentationUpdaterTests.java @@ -14,13 +14,16 @@ * limitations under the License. */ -package org.springframework.cloud.release.internal.docs; +package org.springframework.cloud.release.cloud.docs; import java.io.File; import java.io.IOException; import java.net.URISyntaxException; import java.nio.file.Files; +import javax.validation.constraints.NotNull; + +import edu.emory.mathcs.backport.java.util.Collections; import org.assertj.core.api.BDDAssertions; import org.junit.Before; import org.junit.Rule; @@ -29,9 +32,12 @@ import org.junit.rules.TemporaryFolder; import org.mockito.BDDMockito; import org.springframework.cloud.release.internal.ReleaserProperties; +import org.springframework.cloud.release.internal.buildsystem.TestUtils; +import org.springframework.cloud.release.internal.docs.DocumentationUpdater; import org.springframework.cloud.release.internal.git.ProjectGitHandler; -import org.springframework.cloud.release.internal.pom.ProjectVersion; -import org.springframework.cloud.release.internal.pom.TestUtils; +import org.springframework.cloud.release.internal.github.ProjectGitHubHandler; +import org.springframework.cloud.release.internal.project.ProjectVersion; +import org.springframework.cloud.release.internal.template.TemplateGenerator; import org.springframework.util.FileSystemUtils; import static org.assertj.core.api.BDDAssertions.then; @@ -39,7 +45,7 @@ import static org.assertj.core.api.BDDAssertions.then; /** * @author Marcin Grzejszczak */ -public class ProjectDocumentationUpdaterTests { +public class SpringCloudCustomProjectDocumentationUpdaterTests { @Rule public TemporaryFolder tmp = new TemporaryFolder(); @@ -50,6 +56,8 @@ public class ProjectDocumentationUpdaterTests { ProjectGitHandler handler; + ProjectGitHubHandler gitHubHandler; + File clonedDocProject; ReleaserProperties properties = new ReleaserProperties(); @@ -57,7 +65,7 @@ public class ProjectDocumentationUpdaterTests { @Before public void setup() throws IOException, URISyntaxException { this.tmpFolder = this.tmp.newFolder(); - this.project = new File(ProjectDocumentationUpdaterTests.class + this.project = new File(SpringCloudCustomProjectDocumentationUpdater.class .getResource("/projects/spring-cloud-static").toURI()); TestUtils.prepareLocalRepo(); FileSystemUtils.copyRecursively(file("/projects"), this.tmpFolder); @@ -65,6 +73,7 @@ public class ProjectDocumentationUpdaterTests { file("/projects/spring-cloud-static/").toURI().toString()); this.handler = new ProjectGitHandler(this.properties); this.clonedDocProject = this.handler.cloneDocumentationProject(); + this.gitHubHandler = new ProjectGitHubHandler(this.properties); } @Test @@ -78,9 +87,8 @@ public class ProjectDocumentationUpdaterTests { file("/projects/spring-cloud-release/").toURI().toString()); BDDAssertions - .thenThrownBy(() -> new ProjectDocumentationUpdater(properties, - new ProjectGitHandler(properties)) - .updateDocsRepo(releaseTrainVersion, "vAngel.SR33")) + .thenThrownBy(() -> projectDocumentationUpdaterWithNoIndexHtml(properties) + .updateDocsRepo(releaseTrainVersion, "vAngel.SR33")) .isInstanceOf(IllegalStateException.class) .hasMessageContaining("index.html is not present"); } @@ -94,13 +102,19 @@ public class ProjectDocumentationUpdaterTests { properties.getGit().setDocumentationUrl( file("/projects/spring-cloud-static/").toURI().toString()); - BDDAssertions.thenThrownBy(() -> new ProjectDocumentationUpdater(properties, + SpringCloudCustomProjectDocumentationUpdater customUpdater = new SpringCloudCustomProjectDocumentationUpdater( new ProjectGitHandler(properties)) { @Override String readIndexHtmlContents(File indexHtml) { return ""; } - }.updateDocsRepo(releaseTrainVersion, "vAngel.SR33")) + }; + + BDDAssertions + .thenThrownBy(() -> new DocumentationUpdater(this.handler, properties, + templateGenerator(properties), + Collections.singletonList(customUpdater)) + .updateDocsRepo(releaseTrainVersion, "vAngel.SR33")) .isInstanceOf(IllegalStateException.class) .hasMessageContaining("The URL to the documentation repo not found"); } @@ -111,13 +125,52 @@ public class ProjectDocumentationUpdaterTests { "2.0.0.BUILD-SNAPSHOT"); ReleaserProperties properties = new ReleaserProperties(); - File updatedDocs = new ProjectDocumentationUpdater(properties, - new ProjectGitHandler(properties)).updateDocsRepo(releaseTrainVersion, - "vAngel.M7"); + File updatedDocs = projectDocumentationUpdater(properties) + .updateDocsRepo(releaseTrainVersion, "vAngel.M7"); then(updatedDocs).isNull(); } + @NotNull + private DocumentationUpdater projectDocumentationUpdater( + ReleaserProperties properties) { + return new DocumentationUpdater(this.handler, properties, + templateGenerator(properties), Collections.singletonList( + new SpringCloudCustomProjectDocumentationUpdater(this.handler) { + @Override + boolean isNewerOrEqualReleaseTrain(String storedReleaseTrain, + String firstLetterOfReleaseTrain, + String currentReleaseTrainVersion, + String firstLetterOfCurrentReleaseTrain) { + return true; + } + })); + } + + @NotNull + private DocumentationUpdater projectDocumentationUpdaterWithNoIndexHtml( + ReleaserProperties properties) { + return new DocumentationUpdater(this.handler, properties, + templateGenerator(properties), Collections.singletonList( + new SpringCloudCustomProjectDocumentationUpdater(this.handler) { + @Override + File indexHtml(File clonedDocumentationProject, + String pathToIndexHtml) { + return new File("non/existent/file"); + } + })); + } + + @NotNull + private TemplateGenerator templateGenerator(ReleaserProperties properties) { + return new TemplateGenerator(properties, this.gitHubHandler); + } + + @NotNull + private ProjectGitHandler projectGitHandler(ReleaserProperties properties) { + return new ProjectGitHandler(properties); + } + @Test public void should_not_update_current_version_in_the_docs_if_current_release_starts_with_v_and_then_lower_letter_than_the_stored_release() throws URISyntaxException, IOException { @@ -127,9 +180,9 @@ public class ProjectDocumentationUpdaterTests { properties.getGit().setDocumentationUrl( file("/projects/spring-cloud-static/").toURI().toString()); - File updatedDocs = new ProjectDocumentationUpdater(properties, - new ProjectGitHandler(properties)).updateDocsRepo(releaseTrainVersion, - "vAngel.SR33"); + File updatedDocs = new SpringCloudCustomProjectDocumentationUpdater( + new ProjectGitHandler(properties)).updateDocsRepo(this.clonedDocProject, + releaseTrainVersion, "vAngel.SR33"); String indexHtmlContent = new String( Files.readAllBytes(new File(updatedDocs, "current/index.html").toPath())); @@ -145,8 +198,8 @@ public class ProjectDocumentationUpdaterTests { properties.getGit().setDocumentationUrl(this.clonedDocProject.toURI().toString()); ProjectGitHandler handler = BDDMockito.spy(new ProjectGitHandler(properties)); - new ProjectDocumentationUpdater(properties, handler) - .updateDocsRepo(releaseTrainVersion, "vDalston.SR3"); + new SpringCloudCustomProjectDocumentationUpdater(handler).updateDocsRepo( + this.clonedDocProject, releaseTrainVersion, "vDalston.SR3"); BDDMockito.then(handler).should(BDDMockito.never()) .commit(BDDMockito.any(File.class), BDDMockito.anyString()); @@ -160,9 +213,9 @@ public class ProjectDocumentationUpdaterTests { ReleaserProperties properties = new ReleaserProperties(); properties.getGit().setDocumentationUrl(this.clonedDocProject.toURI().toString()); - File updatedDocs = new ProjectDocumentationUpdater(properties, - new ProjectGitHandler(properties)).updateDocsRepo(releaseTrainVersion, - "Angel.SR33"); + File updatedDocs = new SpringCloudCustomProjectDocumentationUpdater( + new ProjectGitHandler(properties)).updateDocsRepo(this.clonedDocProject, + releaseTrainVersion, "Angel.SR33"); String indexHtmlContent = new String( Files.readAllBytes(new File(updatedDocs, "current/index.html").toPath())); @@ -178,9 +231,8 @@ public class ProjectDocumentationUpdaterTests { ReleaserProperties properties = new ReleaserProperties(); properties.getGit().setDocumentationUrl(this.clonedDocProject.toURI().toString()); - File updatedDocs = new ProjectDocumentationUpdater(properties, - new ProjectGitHandler(properties)).updateDocsRepo(releaseTrainVersion, - "vFinchley.SR33"); + File updatedDocs = projectDocumentationUpdater(properties) + .updateDocsRepo(releaseTrainVersion, "vFinchley.SR33"); String indexHtmlContent = new String( Files.readAllBytes(new File(updatedDocs, "current/index.html").toPath())); @@ -196,9 +248,8 @@ public class ProjectDocumentationUpdaterTests { ReleaserProperties properties = new ReleaserProperties(); properties.getGit().setDocumentationUrl(this.clonedDocProject.toURI().toString()); - File updatedDocs = new ProjectDocumentationUpdater(properties, - new ProjectGitHandler(properties)).updateDocsRepo(releaseTrainVersion, - "Finchley.SR33"); + File updatedDocs = projectDocumentationUpdater(properties) + .updateDocsRepo(releaseTrainVersion, "Finchley.SR33"); String indexHtmlContent = new String( Files.readAllBytes(new File(updatedDocs, "current/index.html").toPath())); @@ -214,16 +265,15 @@ public class ProjectDocumentationUpdaterTests { properties.getGit().setDocumentationUrl(this.clonedDocProject.toURI().toString()); properties.getGit().setUpdateDocumentationRepo(false); - File updatedDocs = new ProjectDocumentationUpdater(properties, - new ProjectGitHandler(properties)).updateDocsRepo(releaseTrainVersion, - "Finchley.SR33"); + File updatedDocs = projectDocumentationUpdater(properties) + .updateDocsRepo(releaseTrainVersion, "Finchley.SR33"); then(updatedDocs).isNull(); } private File file(String relativePath) throws URISyntaxException { - return new File( - ProjectDocumentationUpdaterTests.class.getResource(relativePath).toURI()); + return new File(SpringCloudCustomProjectDocumentationUpdater.class + .getResource(relativePath).toURI()); } } diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/PomUpdateAcceptanceTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/PomUpdateAcceptanceTests.java index 5eae12e4..54e9082b 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/PomUpdateAcceptanceTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/PomUpdateAcceptanceTests.java @@ -20,6 +20,7 @@ import java.io.File; import java.io.IOException; import java.net.URISyntaxException; import java.nio.file.Files; +import java.util.Collections; import org.apache.maven.model.Model; import org.assertj.core.api.BDDAssertions; @@ -28,11 +29,12 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; -import org.springframework.cloud.release.internal.pom.ProjectPomUpdater; -import org.springframework.cloud.release.internal.pom.ProjectVersion; -import org.springframework.cloud.release.internal.pom.Projects; -import org.springframework.cloud.release.internal.pom.TestPomReader; -import org.springframework.cloud.release.internal.pom.TestUtils; +import org.springframework.cloud.release.internal.buildsystem.MavenBomParserAccessor; +import org.springframework.cloud.release.internal.buildsystem.ProjectPomUpdater; +import org.springframework.cloud.release.internal.buildsystem.TestUtils; +import org.springframework.cloud.release.internal.project.ProjectVersion; +import org.springframework.cloud.release.internal.project.Projects; +import org.springframework.cloud.release.internal.tech.PomReader; import org.springframework.util.FileSystemUtils; import static org.assertj.core.api.BDDAssertions.then; @@ -45,8 +47,6 @@ public class PomUpdateAcceptanceTests { @Rule public TemporaryFolder tmp = new TemporaryFolder(); - TestPomReader testPomReader = new TestPomReader(); - File temporaryFolder; @Before @@ -60,7 +60,9 @@ public class PomUpdateAcceptanceTests { public void should_update_all_versions_for_a_release_train() throws Exception { ReleaserProperties releaserProperties = releaserProperties(); releaserProperties.getFixedVersions().put("checkstyle", "100.0.0.RELEASE"); - ProjectPomUpdater projectPomUpdater = new ProjectPomUpdater(releaserProperties); + ProjectPomUpdater projectPomUpdater = new ProjectPomUpdater(releaserProperties, + Collections.singletonList( + MavenBomParserAccessor.cloudMavenBomParser(releaserProperties))); Projects projects = projectPomUpdater.retrieveVersionsFromReleaseTrainBom(); File project = new File(this.temporaryFolder, "/spring-cloud-sleuth"); @@ -68,13 +70,12 @@ public class PomUpdateAcceptanceTests { projects.forFile(project), true); then(this.temporaryFolder).exists(); - Model rootPom = this.testPomReader - .readPom(tmpFile("/spring-cloud-sleuth/pom.xml")); - Model depsPom = this.testPomReader.readPom( + Model rootPom = PomReader.readPom(tmpFile("/spring-cloud-sleuth/pom.xml")); + Model depsPom = PomReader.readPom( tmpFile("/spring-cloud-sleuth/spring-cloud-sleuth-dependencies/pom.xml")); - Model corePom = this.testPomReader.readPom( + Model corePom = PomReader.readPom( tmpFile("/spring-cloud-sleuth/spring-cloud-sleuth-core/pom.xml")); - Model zipkinStreamPom = this.testPomReader.readPom(tmpFile( + Model zipkinStreamPom = PomReader.readPom(tmpFile( "/spring-cloud-sleuth/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin-stream/pom.xml")); then(rootPom.getVersion()).isEqualTo("1.2.0.BUILD-SNAPSHOT"); then(rootPom.getProperties()) @@ -93,7 +94,9 @@ public class PomUpdateAcceptanceTests { public void should_not_fail_when_after_updating_a_release_version_there_still_is_a_snapshot_version() throws Exception { ReleaserProperties releaserProperties = branchReleaserProperties(); - ProjectPomUpdater projectPomUpdater = new ProjectPomUpdater(releaserProperties); + ProjectPomUpdater projectPomUpdater = new ProjectPomUpdater(releaserProperties, + Collections.singletonList( + MavenBomParserAccessor.cloudMavenBomParser(releaserProperties))); Projects projects = projectPomUpdater.retrieveVersionsFromReleaseTrainBom(); projects.add(new ProjectVersion("spring-cloud-sleuth-samples", "0.0.5.RELEASE")); File project = new File(this.temporaryFolder, @@ -115,7 +118,9 @@ public class PomUpdateAcceptanceTests { public void should_not_fail_update_when_after_updating_a_release_version_there_still_is_a_snapshot_version_in_a_non_deployable_module() throws Exception { ReleaserProperties releaserProperties = branchReleaserProperties(); - ProjectPomUpdater projectPomUpdater = new ProjectPomUpdater(releaserProperties); + ProjectPomUpdater projectPomUpdater = new ProjectPomUpdater(releaserProperties, + Collections.singletonList( + MavenBomParserAccessor.cloudMavenBomParser(releaserProperties))); Projects projects = projectPomUpdater.retrieveVersionsFromReleaseTrainBom(); File project = new File(this.temporaryFolder, "/spring-cloud-sleuth-with-unmatched-property"); @@ -131,7 +136,9 @@ public class PomUpdateAcceptanceTests { public void should_update_fail_when_after_updating_a_release_version_there_still_is_a_snapshot_version_for_boot_snapshot_version() throws Exception { ReleaserProperties releaserProperties = branchReleaserProperties(); - ProjectPomUpdater projectPomUpdater = new ProjectPomUpdater(releaserProperties); + ProjectPomUpdater projectPomUpdater = new ProjectPomUpdater(releaserProperties, + Collections.singletonList( + MavenBomParserAccessor.cloudMavenBomParser(releaserProperties))); Projects projects = projectPomUpdater.retrieveVersionsFromReleaseTrainBom(); projects.removeIf(projectVersion -> projectVersion.projectName .contains("spring-cloud-build")); @@ -147,7 +154,9 @@ public class PomUpdateAcceptanceTests { @Test public void should_not_update_a_project_that_is_not_on_the_list() throws Exception { ReleaserProperties releaserProperties = releaserProperties(); - ProjectPomUpdater projectPomUpdater = new ProjectPomUpdater(releaserProperties); + ProjectPomUpdater projectPomUpdater = new ProjectPomUpdater(releaserProperties, + Collections.singletonList( + MavenBomParserAccessor.cloudMavenBomParser(releaserProperties))); File beforeProcessing = pom("/projects/project/"); Projects projects = projectPomUpdater.retrieveVersionsFromReleaseTrainBom(); File project = tmpFile("/project/"); diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/ReleaserTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/ReleaserTests.java index d8ea7e37..7b87fc02 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/ReleaserTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/ReleaserTests.java @@ -31,14 +31,15 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import org.springframework.boot.test.rule.OutputCapture; +import org.springframework.cloud.release.internal.buildsystem.GradleUpdater; +import org.springframework.cloud.release.internal.buildsystem.ProjectPomUpdater; import org.springframework.cloud.release.internal.docs.DocumentationUpdater; import org.springframework.cloud.release.internal.git.ProjectGitHandler; -import org.springframework.cloud.release.internal.gradle.GradleUpdater; -import org.springframework.cloud.release.internal.pom.ProjectPomUpdater; -import org.springframework.cloud.release.internal.pom.ProjectVersion; -import org.springframework.cloud.release.internal.pom.Projects; -import org.springframework.cloud.release.internal.post.PostReleaseActions; -import org.springframework.cloud.release.internal.project.ProjectBuilder; +import org.springframework.cloud.release.internal.github.ProjectGitHubHandler; +import org.springframework.cloud.release.internal.postrelease.PostReleaseActions; +import org.springframework.cloud.release.internal.project.ProjectCommandExecutor; +import org.springframework.cloud.release.internal.project.ProjectVersion; +import org.springframework.cloud.release.internal.project.Projects; import org.springframework.cloud.release.internal.sagan.SaganUpdater; import org.springframework.cloud.release.internal.template.TemplateGenerator; @@ -59,11 +60,14 @@ public class ReleaserTests { ProjectPomUpdater projectPomUpdater; @Mock - ProjectBuilder projectBuilder; + ProjectCommandExecutor projectCommandExecutor; @Mock ProjectGitHandler projectGitHandler; + @Mock + ProjectGitHubHandler projectGitHubHandler; + @Mock TemplateGenerator templateGenerator; @@ -89,9 +93,9 @@ public class ReleaserTests { Releaser releaser(Supplier originalVersionSupplier) { return new Releaser(new ReleaserProperties(), this.projectPomUpdater, - this.projectBuilder, this.projectGitHandler, this.templateGenerator, - this.gradleUpdater, this.saganUpdater, this.documentationUpdater, - this.postReleaseActions) { + this.projectCommandExecutor, this.projectGitHandler, + this.projectGitHubHandler, this.templateGenerator, this.gradleUpdater, + this.saganUpdater, this.documentationUpdater, this.postReleaseActions) { @Override ProjectVersion originalVersion(File project) { return originalVersionSupplier.get(); @@ -101,9 +105,9 @@ public class ReleaserTests { Releaser releaser() { return new Releaser(new ReleaserProperties(), this.projectPomUpdater, - this.projectBuilder, this.projectGitHandler, this.templateGenerator, - this.gradleUpdater, this.saganUpdater, this.documentationUpdater, - this.postReleaseActions); + this.projectCommandExecutor, this.projectGitHandler, + this.projectGitHubHandler, this.templateGenerator, this.gradleUpdater, + this.saganUpdater, this.documentationUpdater, this.postReleaseActions); } @Test @@ -173,7 +177,7 @@ public class ReleaserTests { public void should_not_close_milestone_for_snapshots() { releaser().closeMilestone(new ProjectVersion("original", "1.0.0.BUILD-SNAPSHOT")); - then(this.projectGitHandler).should(never()) + then(this.projectGitHubHandler).should(never()) .closeMilestone(any(ProjectVersion.class)); } diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/GradleBomParserTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/GradleBomParserTests.java new file mode 100644 index 00000000..ba734753 --- /dev/null +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/GradleBomParserTests.java @@ -0,0 +1,123 @@ +/* + * Copyright 2013-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.release.internal.buildsystem; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import org.assertj.core.api.BDDAssertions; +import org.junit.jupiter.api.Test; + +import org.springframework.cloud.release.internal.ReleaserProperties; + +class GradleBomParserTests { + + @Test + void should_read_versions_from_bom_from_properties() { + GradleBomParser parser = new GradleBomParser(new ReleaserProperties(), + new ArrayList<>()) { + @Override + public boolean isApplicable(File clonedBom) { + return true; + } + + @Override + File file(File clonedBom, String child) { + return clonedBom; + } + + @Override + Properties loadProps(File file) { + Properties properties = new Properties(); + properties.setProperty("springCloudContractVersion", "1.0.0.RELEASE"); + return properties; + } + }; + + VersionsFromBom versionsFromBom = parser.versionsFromBom(new File(".")); + + BDDAssertions.then(versionsFromBom.versionForProject("spring-cloud-contract")) + .isEqualTo("1.0.0.RELEASE"); + } + + @Test + void should_return_a_version_from_bom_with_substitution() { + Map gradleSubstitution = new HashMap<>(); + gradleSubstitution.put("verifierVersion", "spring-cloud-contract"); + ReleaserProperties releaserProperties = new ReleaserProperties(); + releaserProperties.getGradle().setGradlePropsSubstitution(gradleSubstitution); + GradleBomParser parser = new GradleBomParser(releaserProperties, + new ArrayList<>()) { + @Override + public boolean isApplicable(File clonedBom) { + return true; + } + + @Override + File file(File clonedBom, String child) { + return clonedBom; + } + + @Override + Properties loadProps(File file) { + Properties properties = new Properties(); + properties.setProperty("verifierVersion", "1.0.0.RELEASE"); + return properties; + } + }; + + VersionsFromBom versionsFromBom = parser.versionsFromBom(new File(".")); + + BDDAssertions.then(versionsFromBom.versionForProject("spring-cloud-contract")) + .isEqualTo("1.0.0.RELEASE"); + } + + @Test + void should_be_not_applicable_when_no_build_gradle_is_present() { + GradleBomParser parser = new GradleBomParser(new ReleaserProperties(), + new ArrayList<>()); + + BDDAssertions.then(parser.isApplicable(new File("."))).isFalse(); + } + + @Test + void should_be_applicable_when_build_gradle_is_present() { + GradleBomParser parser = new GradleBomParser(new ReleaserProperties(), + new ArrayList<>()) { + @Override + File file(File clonedBom, String child) { + return clonedBom; + } + }; + + BDDAssertions.then(parser.isApplicable(new File("."))).isTrue(); + } + + @Test + void should_return_empty_version_when_no_gradle_properties_is_present() { + GradleBomParser parser = new GradleBomParser(new ReleaserProperties(), + new ArrayList<>()); + + VersionsFromBom versionsFromBom = parser.versionsFromBom(new File(".")); + + BDDAssertions.then(versionsFromBom).isSameAs(VersionsFromBom.EMPTY_VERSION); + } + +} \ No newline at end of file diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/LoggerToMavenLogTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/LoggerToMavenLogTests.java similarity index 98% rename from spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/LoggerToMavenLogTests.java rename to spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/LoggerToMavenLogTests.java index 67cb1e16..e048e96f 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/LoggerToMavenLogTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/LoggerToMavenLogTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.release.internal.pom; +package org.springframework.cloud.release.internal.buildsystem; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/MavenBomParserAccessor.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/MavenBomParserAccessor.java new file mode 100644 index 00000000..dd8c8d96 --- /dev/null +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/MavenBomParserAccessor.java @@ -0,0 +1,31 @@ +/* + * Copyright 2013-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.release.internal.buildsystem; + +import java.util.Collections; + +import org.springframework.cloud.release.cloud.buildsystem.SpringCloudMavenBomParserAccessor; +import org.springframework.cloud.release.internal.ReleaserProperties; + +public class MavenBomParserAccessor { + + public static BomParser cloudMavenBomParser(ReleaserProperties properties) { + return new MavenBomParser(properties, + Collections.singletonList(SpringCloudMavenBomParserAccessor.cloud())); + } + +} diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/BomParserTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/MavenBomParserTests.java similarity index 59% rename from spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/BomParserTests.java rename to spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/MavenBomParserTests.java index 0cef174d..c5e8b37b 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/BomParserTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/MavenBomParserTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.release.internal.pom; +package org.springframework.cloud.release.internal.buildsystem; import java.io.File; import java.net.URISyntaxException; @@ -24,6 +24,7 @@ import org.junit.Test; import org.springframework.cloud.release.internal.ReleaserProperties; import org.springframework.cloud.release.internal.git.GitRepoTests; +import org.springframework.cloud.release.internal.project.Project; import static org.assertj.core.api.BDDAssertions.then; import static org.assertj.core.api.BDDAssertions.thenThrownBy; @@ -31,7 +32,7 @@ import static org.assertj.core.api.BDDAssertions.thenThrownBy; /** * @author Marcin Grzejszczak */ -public class BomParserTests { +public class MavenBomParserTests { File springCloudReleaseProject; @@ -45,9 +46,11 @@ public class BomParserTests { @Test public void should_throw_exception_when_boot_pom_is_missing() { - BomParser parser = new BomParser(this.properties, new File(".")); + BomParser parser = MavenBomParserAccessor.cloudMavenBomParser(this.properties); + File file = new File("."); - thenThrownBy(parser::bootVersion).isInstanceOf(IllegalStateException.class) + thenThrownBy(() -> parser.versionsFromBom(file)) + .isInstanceOf(IllegalStateException.class) .hasMessageContaining("Pom is not present"); } @@ -55,28 +58,28 @@ public class BomParserTests { public void should_throw_exception_when_null_is_passed_to_boot() { this.properties.getPom().setPomWithBootStarterParent(null); this.properties.getPom().setThisTrainBom(null); - BomParser parser = new BomParser(this.properties, this.springCloudReleaseProject); + BomParser parser = MavenBomParserAccessor.cloudMavenBomParser(this.properties); - thenThrownBy(parser::bootVersion).isInstanceOf(IllegalStateException.class) + thenThrownBy(() -> parser.versionsFromBom(this.springCloudReleaseProject)) + .isInstanceOf(IllegalStateException.class) .hasMessageContaining("Pom is not present"); } @Test public void should_throw_exception_when_boot_version_is_missing_in_pom() { this.properties.getPom().setPomWithBootStarterParent("pom.xml"); - this.properties.getPom().setThisTrainBom(null); - BomParser parser = new BomParser(this.properties, this.springCloudReleaseProject); + BomParser parser = MavenBomParserAccessor.cloudMavenBomParser(this.properties); - thenThrownBy(parser::bootVersion).isInstanceOf(IllegalStateException.class) - .hasMessageContaining( + thenThrownBy(() -> parser.versionsFromBom(this.springCloudReleaseProject)) + .isInstanceOf(IllegalStateException.class).hasMessageContaining( "The pom doesn't have a [spring-boot-starter-parent] artifact id"); } @Test public void should_populate_sc_release_version() { - BomParser parser = new BomParser(this.properties, this.springCloudReleaseProject); + BomParser parser = MavenBomParserAccessor.cloudMavenBomParser(this.properties); - String scReleaseVersion = parser.allVersions() + String scReleaseVersion = parser.versionsFromBom(this.springCloudReleaseProject) .versionForProject("spring-cloud-release"); then(scReleaseVersion).isEqualTo("Dalston.BUILD-SNAPSHOT"); @@ -84,18 +87,20 @@ public class BomParserTests { @Test public void should_populate_boot_version() { - BomParser parser = new BomParser(this.properties, this.springCloudReleaseProject); + BomParser parser = MavenBomParserAccessor.cloudMavenBomParser(this.properties); - String bootVersion = parser.bootVersion().bootVersion; + String bootVersion = parser.versionsFromBom(this.springCloudReleaseProject) + .versionForProject("spring-boot"); then(bootVersion).isEqualTo("1.5.1.BUILD-SNAPSHOT"); } @Test public void should_throw_exception_when_cloud_pom_is_missing() { - BomParser parser = new BomParser(this.properties, new File(".")); + BomParser parser = MavenBomParserAccessor.cloudMavenBomParser(this.properties); - thenThrownBy(parser::versionsFromBom).isInstanceOf(IllegalStateException.class) + thenThrownBy(() -> parser.versionsFromBom(new File("."))) + .isInstanceOf(IllegalStateException.class) .hasMessageContaining("Pom is not present"); } @@ -103,42 +108,48 @@ public class BomParserTests { public void should_throw_exception_when_null_is_passed_to_cloud() { this.properties.getPom().setPomWithBootStarterParent(null); this.properties.getPom().setThisTrainBom(null); - BomParser parser = new BomParser(this.properties, this.springCloudReleaseProject); + BomParser parser = MavenBomParserAccessor.cloudMavenBomParser(this.properties); - thenThrownBy(parser::versionsFromBom).isInstanceOf(IllegalStateException.class) + thenThrownBy(() -> parser.versionsFromBom(this.springCloudReleaseProject)) + .isInstanceOf(IllegalStateException.class) .hasMessageContaining("Pom is not present"); } @Test public void should_throw_exception_when_cloud_version_is_missing_in_pom() { - this.properties.getPom().setPomWithBootStarterParent(null); + this.properties.getPom().setPomWithBootStarterParent("pom.xml"); this.properties.getPom().setThisTrainBom("pom.xml"); - BomParser parser = new BomParser(this.properties, this.springCloudReleaseProject); + BomParser parser = MavenBomParserAccessor.cloudMavenBomParser(this.properties); - thenThrownBy(parser::versionsFromBom).isInstanceOf(IllegalStateException.class) - .hasMessageContaining( + thenThrownBy(() -> parser.versionsFromBom(this.springCloudReleaseProject)) + .isInstanceOf(IllegalStateException.class).hasMessageContaining( "The pom doesn't have a [spring-cloud-dependencies-parent] artifact id"); } @Test public void should_populate_cloud_version() { - BomParser parser = new BomParser(this.properties, this.springCloudReleaseProject); + BomParser parser = MavenBomParserAccessor.cloudMavenBomParser(this.properties); - Versions cloudVersions = parser.versionsFromBom(); + VersionsFromBom cloudVersionsFromBom = parser + .versionsFromBom(this.springCloudReleaseProject); - then(cloudVersions.scBuildVersion).isEqualTo("1.3.1.BUILD-SNAPSHOT"); - then(cloudVersions.projects).contains(allProjects()); + then(cloudVersionsFromBom.versionForProject("spring-cloud-build")) + .isEqualTo("1.3.1.BUILD-SNAPSHOT"); + then(cloudVersionsFromBom.projects).contains(allProjects()); } @Test public void should_populate_boot_and_cloud_version() { - BomParser parser = new BomParser(this.properties, this.springCloudReleaseProject); + BomParser parser = MavenBomParserAccessor.cloudMavenBomParser(this.properties); - Versions cloudVersions = parser.allVersions(); + VersionsFromBom cloudVersionsFromBom = parser + .versionsFromBom(this.springCloudReleaseProject); - then(cloudVersions.bootVersion).isEqualTo("1.5.1.BUILD-SNAPSHOT"); - then(cloudVersions.scBuildVersion).isEqualTo("1.3.1.BUILD-SNAPSHOT"); - then(cloudVersions.projects).contains(allProjects()); + then(cloudVersionsFromBom.versionForProject("spring-boot")) + .isEqualTo("1.5.1.BUILD-SNAPSHOT"); + then(cloudVersionsFromBom.versionForProject("spring-cloud-build")) + .isEqualTo("1.3.1.BUILD-SNAPSHOT"); + then(cloudVersionsFromBom.projects).contains(allProjects()); } private Project[] allProjects() { diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/PomReaderTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/PomReaderTests.java similarity index 82% rename from spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/PomReaderTests.java rename to spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/PomReaderTests.java index 57b77886..1660972f 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/PomReaderTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/PomReaderTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.release.internal.pom; +package org.springframework.cloud.release.internal.buildsystem; import java.io.EOFException; import java.io.File; @@ -27,6 +27,7 @@ import org.junit.Before; import org.junit.Test; import org.springframework.cloud.release.internal.git.GitRepoTests; +import org.springframework.cloud.release.internal.tech.PomReader; import static org.assertj.core.api.BDDAssertions.then; import static org.assertj.core.api.BDDAssertions.thenThrownBy; @@ -36,8 +37,6 @@ import static org.assertj.core.api.BDDAssertions.thenThrownBy; */ public class PomReaderTests { - PomReader pomReader = new PomReader(); - File springCloudReleaseProjectPom; File springCloudReleaseProject; @@ -59,7 +58,7 @@ public class PomReaderTests { @Test public void should_parse_a_valid_pom() { - Model pom = this.pomReader.readPom(this.springCloudReleaseProjectPom); + Model pom = PomReader.readPom(this.springCloudReleaseProjectPom); then(pom).isNotNull(); then(pom.getArtifactId()).isEqualTo("spring-cloud-starter-build"); @@ -67,7 +66,7 @@ public class PomReaderTests { @Test public void should_parse_a_valid_pom_when_passing_direcory() { - Model pom = this.pomReader.readPom(this.springCloudReleaseProject); + Model pom = PomReader.readPom(this.springCloudReleaseProject); then(pom).isNotNull(); then(pom.getArtifactId()).isEqualTo("spring-cloud-starter-build"); @@ -75,20 +74,20 @@ public class PomReaderTests { @Test public void should_return_null_when_file_is_missing() { - then(this.pomReader.readPom(new File("foo/bar"))).isNull(); + then(PomReader.readPom(new File("foo/bar"))).isNull(); } @Test public void should_throw_exception_when_file_is_invalid() { - thenThrownBy(() -> this.pomReader.readPom(this.licenseFile)) + thenThrownBy(() -> PomReader.readPom(this.licenseFile)) .hasMessageStartingWith("Failed to read file: ") .hasCauseInstanceOf(XmlPullParserException.class); } @Test public void should_throw_exception_when_file_is_empty() { - thenThrownBy(() -> this.pomReader.readPom(this.empty)) - .hasMessageStartingWith("File [").hasMessageContaining("] is empty") + thenThrownBy(() -> PomReader.readPom(this.empty)).hasMessageStartingWith("File [") + .hasMessageContaining("] is empty") .hasCauseInstanceOf(EOFException.class); } diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/PomUpdaterTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/PomUpdaterTests.java similarity index 87% rename from spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/PomUpdaterTests.java rename to spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/PomUpdaterTests.java index 0bcc0884..8c641298 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/PomUpdaterTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/PomUpdaterTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.release.internal.pom; +package org.springframework.cloud.release.internal.buildsystem; import java.io.File; import java.io.IOException; @@ -31,7 +31,10 @@ import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.springframework.boot.test.rule.OutputCapture; +import org.springframework.cloud.release.internal.ReleaserProperties; import org.springframework.cloud.release.internal.git.GitRepoTests; +import org.springframework.cloud.release.internal.project.Project; +import org.springframework.cloud.release.internal.tech.PomReader; import org.springframework.util.FileSystemUtils; /** @@ -45,12 +48,14 @@ public class PomUpdaterTests { @Rule public TemporaryFolder tmp = new TemporaryFolder(); - Versions versions = new Versions("0.0.1", "0.0.2", projects()); + VersionsFromBom versionsFromBom = new VersionsFromBomBuilder() + .releaserProperties(new ReleaserProperties()).projects(projects()) + .parsers(MavenBomParserAccessor.cloudMavenBomParser(new ReleaserProperties()) + .customBomParsers()) + .retrieveFromBom(); PomUpdater pomUpdater = new PomUpdater(); - PomReader pomReader = new PomReader(); - File temporaryFolder; @Before @@ -65,7 +70,7 @@ public class PomUpdaterTests { File springCloudReleasePom = file("/projects/spring-cloud-release"); BDDAssertions.then(this.pomUpdater.shouldProjectBeUpdated(springCloudReleasePom, - this.versions)).isFalse(); + this.versionsFromBom)).isFalse(); } @Test @@ -73,8 +78,8 @@ public class PomUpdaterTests { throws Exception { File springCloud = pom("/projects/project", "pom_with_parent_suffix.xml"); - BDDAssertions - .then(this.pomUpdater.shouldProjectBeUpdated(springCloud, this.versions)) + BDDAssertions.then( + this.pomUpdater.shouldProjectBeUpdated(springCloud, this.versionsFromBom)) .isFalse(); } @@ -84,8 +89,8 @@ public class PomUpdaterTests { File springCloud = pom("/projects/project", "pom_matching_with_parent_suffix.xml"); - BDDAssertions - .then(this.pomUpdater.shouldProjectBeUpdated(springCloud, this.versions)) + BDDAssertions.then( + this.pomUpdater.shouldProjectBeUpdated(springCloud, this.versionsFromBom)) .isTrue(); } @@ -95,7 +100,7 @@ public class PomUpdaterTests { File springCloudSleuthPom = file("/projects/spring-cloud-sleuth"); BDDAssertions.then(this.pomUpdater.shouldProjectBeUpdated(springCloudSleuthPom, - this.versions)).isTrue(); + this.versionsFromBom)).isTrue(); } @Test @@ -104,7 +109,7 @@ public class PomUpdaterTests { File springCloudSleuthPom = file("/projects/spring-cloud-sleuth/empty-folder"); BDDAssertions.then(this.pomUpdater.shouldProjectBeUpdated(springCloudSleuthPom, - this.versions)).isFalse(); + this.versionsFromBom)).isFalse(); } @Test @@ -113,9 +118,9 @@ public class PomUpdaterTests { File pomInTemp = tmpFile("/project/pom.xml"); ModelWrapper rootPom = model("foo"); ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, - this.versions); + this.versionsFromBom); - File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versions, + File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, pomInTemp); BDDAssertions.then(asString(storedPom)).isEqualTo(asString(originalPom)); @@ -128,13 +133,13 @@ public class PomUpdaterTests { File pomInTemp = tmpFile("/project/pom_matching_artifact.xml"); ModelWrapper rootPom = model("spring-cloud-sleuth"); ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, - this.versions); + this.versionsFromBom); - File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versions, + File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, pomInTemp); BDDAssertions.then(asString(storedPom)).isNotEqualTo(asString(originalPom)); - Model overriddenPomModel = this.pomReader.readPom(storedPom); + Model overriddenPomModel = PomReader.readPom(storedPom); BDDAssertions.then(overriddenPomModel.getVersion()) .isEqualTo("0.0.3.BUILD-SNAPSHOT"); } @@ -146,13 +151,13 @@ public class PomUpdaterTests { File pomInTemp = tmpFile("/project/pom_matching_parent_v2.xml"); ModelWrapper rootPom = model("spring-cloud-sleuth"); ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, - this.versions); + this.versionsFromBom); - File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versions, + File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, pomInTemp); BDDAssertions.then(asString(originalPom)).isNotEqualTo(asString(storedPom)); - Model overriddenPomModel = this.pomReader.readPom(storedPom); + Model overriddenPomModel = PomReader.readPom(storedPom); BDDAssertions.then(overriddenPomModel.getVersion()) .isEqualTo("0.0.3.BUILD-SNAPSHOT"); BDDAssertions.then(overriddenPomModel.getParent().getVersion()) @@ -166,13 +171,13 @@ public class PomUpdaterTests { File pomInTemp = tmpFile("/project/pom_matching_parent.xml"); ModelWrapper rootPom = model("spring-cloud-sleuth"); ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, - this.versions); + this.versionsFromBom); - File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versions, + File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, pomInTemp); BDDAssertions.then(asString(storedPom)).isNotEqualTo(asString(originalPom)); - Model overriddenPomModel = this.pomReader.readPom(storedPom); + Model overriddenPomModel = PomReader.readPom(storedPom); BDDAssertions.then(overriddenPomModel.getVersion()) .isEqualTo("0.0.3.BUILD-SNAPSHOT"); BDDAssertions.then(overriddenPomModel.getParent().getVersion()) @@ -185,7 +190,7 @@ public class PomUpdaterTests { File springCloudReleasePom = file("/projects/spring-cloud-release"); BDDAssertions.then(this.pomUpdater.shouldProjectBeUpdated(springCloudReleasePom, - this.versions)).isFalse(); + this.versionsFromBom)).isFalse(); } @Test @@ -194,7 +199,7 @@ public class PomUpdaterTests { File springCloudSleuthPom = file("/projects/spring-cloud-sleuth"); BDDAssertions.then(this.pomUpdater.shouldProjectBeUpdated(springCloudSleuthPom, - this.versions)).isTrue(); + this.versionsFromBom)).isTrue(); } @Test @@ -205,13 +210,13 @@ public class PomUpdaterTests { File pomInTemp = tmpFile("/project/children/pom_matching_parent_v2.xml"); ModelWrapper rootPom = model("spring-cloud-sleuth"); ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, - this.versions); + this.versionsFromBom); - File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versions, + File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, pomInTemp); BDDAssertions.then(asString(storedPom)).isNotEqualTo(asString(originalPom)); - Model overriddenPomModel = this.pomReader.readPom(storedPom); + Model overriddenPomModel = PomReader.readPom(storedPom); BDDAssertions.then(overriddenPomModel.getVersion()) .isEqualTo("0.0.3.BUILD-SNAPSHOT"); BDDAssertions.then(overriddenPomModel.getParent().getVersion()) @@ -230,13 +235,13 @@ public class PomUpdaterTests { File pomInTemp = tmpFile("/project/children/pom_different_group_boot_parent.xml"); ModelWrapper rootPom = model("spring-cloud-sleuth", "org.springframework.cloud"); ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, - this.versions); + this.versionsFromBom); - File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versions, + File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, pomInTemp); BDDAssertions.then(asString(storedPom)).isNotEqualTo(asString(originalPom)); - Model overriddenPomModel = this.pomReader.readPom(storedPom); + Model overriddenPomModel = PomReader.readPom(storedPom); BDDAssertions.then(overriddenPomModel.getVersion()) .isEqualTo("0.0.3.BUILD-SNAPSHOT"); BDDAssertions.then(overriddenPomModel.getParent().getVersion()) @@ -252,13 +257,13 @@ public class PomUpdaterTests { File pomInTemp = tmpFile("/project/children/pom_different_group.xml"); ModelWrapper rootPom = model("spring-cloud-sleuth", "org.springframework.cloud"); ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, - this.versions); + this.versionsFromBom); - File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versions, + File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, pomInTemp); BDDAssertions.then(asString(storedPom)).isNotEqualTo(asString(originalPom)); - Model overriddenPomModel = this.pomReader.readPom(storedPom); + Model overriddenPomModel = PomReader.readPom(storedPom); BDDAssertions.then(overriddenPomModel.getVersion()) .isEqualTo("1.2.2.BUILD-SNAPSHOT"); BDDAssertions.then(overriddenPomModel.getParent().getVersion()) @@ -277,13 +282,13 @@ public class PomUpdaterTests { "/project/children/pom_different_group_skip_deployment_prop.xml"); ModelWrapper rootPom = model("spring-cloud-sleuth", "org.springframework.cloud"); ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, - this.versions); + this.versionsFromBom); - File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versions, + File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, pomInTemp); BDDAssertions.then(asString(storedPom)).isNotEqualTo(asString(originalPom)); - Model overriddenPomModel = this.pomReader.readPom(storedPom); + Model overriddenPomModel = PomReader.readPom(storedPom); BDDAssertions.then(overriddenPomModel.getVersion()) .isEqualTo("1.2.2.BUILD-SNAPSHOT"); BDDAssertions.then(overriddenPomModel.getParent().getVersion()) @@ -302,13 +307,13 @@ public class PomUpdaterTests { "/project/children/pom_different_group_skip_deployment_plugin.xml"); ModelWrapper rootPom = model("spring-cloud-sleuth", "org.springframework.cloud"); ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, - this.versions); + this.versionsFromBom); - File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versions, + File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, pomInTemp); BDDAssertions.then(asString(storedPom)).isNotEqualTo(asString(originalPom)); - Model overriddenPomModel = this.pomReader.readPom(storedPom); + Model overriddenPomModel = PomReader.readPom(storedPom); BDDAssertions.then(overriddenPomModel.getVersion()) .isEqualTo("1.2.2.BUILD-SNAPSHOT"); BDDAssertions.then(overriddenPomModel.getParent().getVersion()) @@ -327,13 +332,13 @@ public class PomUpdaterTests { "/project/children/pom_different_group_skip_deployment_plugin_mngmnt.xml"); ModelWrapper rootPom = model("spring-cloud-sleuth", "org.springframework.cloud"); ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, - this.versions); + this.versionsFromBom); - File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versions, + File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, pomInTemp); BDDAssertions.then(asString(storedPom)).isNotEqualTo(asString(originalPom)); - Model overriddenPomModel = this.pomReader.readPom(storedPom); + Model overriddenPomModel = PomReader.readPom(storedPom); BDDAssertions.then(overriddenPomModel.getVersion()) .isEqualTo("1.2.2.BUILD-SNAPSHOT"); BDDAssertions.then(overriddenPomModel.getParent().getVersion()) @@ -352,13 +357,13 @@ public class PomUpdaterTests { ModelWrapper rootPom = model("spring-cloud-contract", "org.springframework.cloud"); ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, - this.versions); + this.versionsFromBom); - File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versions, + File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, pomInTemp); BDDAssertions.then(asString(storedPom)).isNotEqualTo(asString(originalPom)); - Model overriddenPomModel = this.pomReader.readPom(storedPom); + Model overriddenPomModel = PomReader.readPom(storedPom); BDDAssertions.then(overriddenPomModel.getParent().getVersion()) .isEqualTo("0.0.1"); @@ -371,13 +376,13 @@ public class PomUpdaterTests { File pomInTemp = tmpFile("/project/children/pom_matching_parent.xml"); ModelWrapper rootPom = model("spring-cloud-sleuth"); ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, - this.versions); + this.versionsFromBom); - File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versions, + File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, pomInTemp); BDDAssertions.then(asString(storedPom)).isNotEqualTo(asString(originalPom)); - Model overriddenPomModel = this.pomReader.readPom(storedPom); + Model overriddenPomModel = PomReader.readPom(storedPom); BDDAssertions.then(overriddenPomModel.getVersion()) .isEqualTo("0.0.3.BUILD-SNAPSHOT"); BDDAssertions.then(overriddenPomModel.getParent().getVersion()) @@ -395,13 +400,13 @@ public class PomUpdaterTests { File pomInTemp = tmpFile("/project/children/pom_matching_properties.xml"); ModelWrapper rootPom = model("spring-cloud-sleuth"); ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, - this.versions); + this.versionsFromBom); - File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versions, + File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, pomInTemp); BDDAssertions.then(asString(storedPom)).isNotEqualTo(asString(originalPom)); - Model overriddenPomModel = this.pomReader.readPom(storedPom); + Model overriddenPomModel = PomReader.readPom(storedPom); BDDAssertions.then(overriddenPomModel.getVersion()) .isEqualTo("0.0.3.BUILD-SNAPSHOT"); BDDAssertions.then(overriddenPomModel.getParent().getVersion()) @@ -418,10 +423,10 @@ public class PomUpdaterTests { "pom_matching_properties.xml"); File afterProcessing = tmpFile("/project/children/pom_matching_properties.xml"); ModelWrapper model = this.pomUpdater.updateModel(model("spring-cloud-sleuth"), - afterProcessing, this.versions); + afterProcessing, this.versionsFromBom); File processedPom = this.pomUpdater.overwritePomIfDirty(model, - Versions.EMPTY_VERSION, afterProcessing); + VersionsFromBom.EMPTY_VERSION, afterProcessing); String processedPomText = asString(processedPom); String beforeProcessingText = asString(beforeProcessing); @@ -434,10 +439,10 @@ public class PomUpdaterTests { File beforeProcessing = pom("/projects/project/"); File afterProcessing = tmpFile("/project/pom.xml"); ModelWrapper model = this.pomUpdater.updateModel(model("foo"), afterProcessing, - this.versions); + this.versionsFromBom); File processedPom = this.pomUpdater.overwritePomIfDirty(model, - Versions.EMPTY_VERSION, afterProcessing); + VersionsFromBom.EMPTY_VERSION, afterProcessing); BDDAssertions.then(asString(processedPom)).isEqualTo(asString(beforeProcessing)); } @@ -449,13 +454,13 @@ public class PomUpdaterTests { File pomInTemp = tmpFile("/spring-cloud-contract/pom.xml"); ModelWrapper rootPom = model("spring-cloud-contract-parent"); ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, - this.versions); + this.versionsFromBom); - File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versions, + File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, pomInTemp); BDDAssertions.then(asString(storedPom)).isNotEqualTo(asString(originalPom)); - Model overriddenPomModel = this.pomReader.readPom(storedPom); + Model overriddenPomModel = PomReader.readPom(storedPom); BDDAssertions.then(overriddenPomModel.getVersion()) .isEqualTo("0.0.2.BUILD-SNAPSHOT"); BDDAssertions.then(overriddenPomModel.getParent().getVersion()) @@ -470,9 +475,9 @@ public class PomUpdaterTests { File pomInTemp = tmpFile("/project/pom_matching_artifact_same_version.xml"); ModelWrapper rootPom = model("spring-cloud-sleuth"); ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, - this.versions); + this.versionsFromBom); - File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versions, + File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, pomInTemp); BDDAssertions.then(asString(storedPom)).isEqualTo(asString(originalPom)); @@ -480,6 +485,8 @@ public class PomUpdaterTests { Set projects() { Set projects = new HashSet<>(); + projects.add(new Project("spring-boot", "0.0.1")); + projects.add(new Project("spring-cloud-build", "0.0.2")); projects.add(new Project("spring-cloud-contract", "0.0.2.BUILD-SNAPSHOT")); projects.add(new Project("spring-cloud-sleuth", "0.0.3.BUILD-SNAPSHOT")); projects.add(new Project("spring-cloud-vault", "0.0.4.BUILD-SNAPSHOT")); diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/ProjectPomUpdaterTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/ProjectPomUpdaterTests.java similarity index 86% rename from spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/ProjectPomUpdaterTests.java rename to spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/ProjectPomUpdaterTests.java index 5d4ba760..e26839ab 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/ProjectPomUpdaterTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/ProjectPomUpdaterTests.java @@ -14,9 +14,10 @@ * limitations under the License. */ -package org.springframework.cloud.release.internal.pom; +package org.springframework.cloud.release.internal.buildsystem; import java.io.File; +import java.util.Collections; import java.util.Map; import java.util.stream.Collectors; @@ -26,6 +27,8 @@ import org.mockito.BDDMockito; import org.springframework.cloud.release.internal.ReleaserProperties; import org.springframework.cloud.release.internal.git.ProjectGitHandler; +import org.springframework.cloud.release.internal.project.ProjectVersion; +import org.springframework.cloud.release.internal.project.Projects; /** * @author Marcin Grzejszczak @@ -64,7 +67,8 @@ public class ProjectPomUpdaterTests { "Finchley.BUILD-SNAPSHOT"); properties.getFixedVersions().put("spring-boot", "2.0.3.RELEASE"); properties.getFixedVersions().put("spring-cloud-gateway", "2.0.1.BUILD-SNAPSHOT"); - ProjectPomUpdater updater = new ProjectPomUpdater(properties); + ProjectPomUpdater updater = new ProjectPomUpdater(properties, Collections + .singletonList(MavenBomParserAccessor.cloudMavenBomParser(properties))); Map fixedVersions = updater.fixedVersions().stream() .collect(Collectors.toMap(projectVersion -> projectVersion.projectName, @@ -74,7 +78,8 @@ public class ProjectPomUpdaterTests { .containsEntry("spring-boot-dependencies", "2.0.3.RELEASE") .containsEntry("spring-boot-starter", "2.0.3.RELEASE") .containsEntry("spring-cloud-build", "2.0.3.BUILD-SNAPSHOT") - .containsEntry("spring-cloud-dependencies", "2.0.3.BUILD-SNAPSHOT") + .containsEntry("spring-cloud-dependencies-parent", "2.0.3.BUILD-SNAPSHOT") + .containsEntry("spring-cloud-dependencies", "Finchley.BUILD-SNAPSHOT") .containsEntry("spring-cloud-release", "Finchley.BUILD-SNAPSHOT") .containsEntry("spring-cloud", "Finchley.BUILD-SNAPSHOT"); } @@ -83,7 +88,8 @@ public class ProjectPomUpdaterTests { public void should_skip_any_steps_if_there_is_no_pom_xml() { ReleaserProperties properties = new ReleaserProperties(); ProjectGitHandler handler = BDDMockito.mock(ProjectGitHandler.class); - ProjectPomUpdater updater = new ProjectPomUpdater(properties, handler); + ProjectPomUpdater updater = new ProjectPomUpdater(properties, Collections + .singletonList(MavenBomParserAccessor.cloudMavenBomParser(properties))); updater.updateProjectFromReleaseTrain(new File("target"), new Projects(), new ProjectVersion("foo", "1.0.0.RELEASE"), false); diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/ProjectVersionTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/ProjectVersionTests.java similarity index 98% rename from spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/ProjectVersionTests.java rename to spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/ProjectVersionTests.java index d93a0e47..548e7ad5 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/ProjectVersionTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/ProjectVersionTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.release.internal.pom; +package org.springframework.cloud.release.internal.buildsystem; import java.io.File; import java.net.URI; @@ -26,6 +26,7 @@ import org.junit.Before; import org.junit.Test; import org.springframework.cloud.release.internal.git.GitRepoTests; +import org.springframework.cloud.release.internal.project.ProjectVersion; import static org.assertj.core.api.BDDAssertions.then; import static org.assertj.core.api.BDDAssertions.thenThrownBy; @@ -49,14 +50,6 @@ public class ProjectVersionTests { this.springCloudContract = new File(scContract.getPath(), "pom.xml"); } - @Test - public void should_build_version_from_text_when_parent_suffix_is_present() { - ProjectVersion projectVersion = new ProjectVersion("foo-parent", "1.0.0"); - - then(projectVersion.version).isEqualTo("1.0.0"); - then(projectVersion.projectName).isEqualTo("foo"); - } - @Test public void should_build_version_from_text() { ProjectVersion projectVersion = new ProjectVersion("foo", "1.0.0"); diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/ProjectsTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/ProjectsTests.java similarity index 97% rename from spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/ProjectsTests.java rename to spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/ProjectsTests.java index 4b3f76b1..47b44a5b 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/ProjectsTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/ProjectsTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.release.internal.pom; +package org.springframework.cloud.release.internal.buildsystem; import java.io.File; import java.net.URISyntaxException; @@ -25,6 +25,8 @@ import java.util.Set; import org.junit.Test; import org.springframework.cloud.release.internal.ReleaserProperties; +import org.springframework.cloud.release.internal.project.ProjectVersion; +import org.springframework.cloud.release.internal.project.Projects; import static org.assertj.core.api.BDDAssertions.then; import static org.assertj.core.api.BDDAssertions.thenThrownBy; diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/PropertyStorerTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/PropertyStorerTests.java similarity index 92% rename from spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/PropertyStorerTests.java rename to spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/PropertyStorerTests.java index 18db90c8..a47d4010 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/PropertyStorerTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/PropertyStorerTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.release.internal.pom; +package org.springframework.cloud.release.internal.buildsystem; import org.apache.maven.plugin.logging.Log; import org.codehaus.mojo.versions.rewriting.ModifiedPomXMLEventReader; @@ -25,6 +25,8 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.cloud.release.internal.project.Project; + import static org.mockito.BDDMockito.then; /** diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/PropertyVersionChangerTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/PropertyVersionChangerTests.java similarity index 90% rename from spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/PropertyVersionChangerTests.java rename to spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/PropertyVersionChangerTests.java index cf30cde3..36011c85 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/PropertyVersionChangerTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/PropertyVersionChangerTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.release.internal.pom; +package org.springframework.cloud.release.internal.buildsystem; import java.util.HashSet; import java.util.Properties; @@ -27,6 +27,9 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.cloud.release.internal.ReleaserProperties; +import org.springframework.cloud.release.internal.project.Project; + import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.then; import static org.mockito.Mockito.never; @@ -75,8 +78,9 @@ public class PropertyVersionChangerTests { .setPropertyVersionIfApplicable(any(Project.class)); } - Versions versions() { - return new Versions("", "", allProjects()); + VersionsFromBom versions() { + return new VersionsFromBomBuilder().releaserProperties(new ReleaserProperties()) + .projects(allProjects()).retrieveFromBom(); } @SuppressWarnings("unchecked") diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/TestUtils.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/TestUtils.java similarity index 96% rename from spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/TestUtils.java rename to spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/TestUtils.java index e14db287..99f4b138 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/TestUtils.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/TestUtils.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.release.internal.pom; +package org.springframework.cloud.release.internal.buildsystem; import java.io.File; import java.io.IOException; diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/VersionChangeAssertions.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/VersionChangeAssertions.java similarity index 96% rename from spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/VersionChangeAssertions.java rename to spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/VersionChangeAssertions.java index 3cffd5b3..ed454d82 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/VersionChangeAssertions.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/VersionChangeAssertions.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.release.internal.pom; +package org.springframework.cloud.release.internal.buildsystem; import java.util.ArrayList; import java.util.List; diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/VersionsFromBomTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/VersionsFromBomTests.java new file mode 100644 index 00000000..5dd50a87 --- /dev/null +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/buildsystem/VersionsFromBomTests.java @@ -0,0 +1,301 @@ +/* + * Copyright 2013-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.release.internal.buildsystem; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Properties; +import java.util.Set; + +import org.junit.Test; + +import org.springframework.cloud.release.cloud.buildsystem.SpringCloudMavenBomParserAccessor; +import org.springframework.cloud.release.internal.ReleaserProperties; +import org.springframework.cloud.release.internal.project.Project; + +import static org.assertj.core.api.BDDAssertions.then; + +/** + * @author Marcin Grzejszczak + */ +public class VersionsFromBomTests { + + VersionsFromBom versionsFromBom = new VersionsFromBomBuilder() + .releaserProperties(new ReleaserProperties()).projects(projects()) + .retrieveFromBom(); + + @Test + public void should_add_boot_to_versions_when_version_is_created() { + VersionsFromBom versionsFromBom = new VersionsFromBomBuilder() + .releaserProperties(new ReleaserProperties()) + .parsers(Collections + .singletonList(SpringCloudMavenBomParserAccessor.cloud())) + .retrieveFromBom(); + versionsFromBom.setVersion("spring-boot", "1.2.3.RELEASE"); + + then(versionsFromBom.projects).contains( + new Project("spring-boot", "1.2.3.RELEASE"), + new Project("spring-boot-starter-parent", "1.2.3.RELEASE"), + new Project("spring-boot-dependencies", "1.2.3.RELEASE")); + } + + @Test + public void should_return_true_when_project_is_on_the_list() { + then(this.versionsFromBom.shouldBeUpdated("foo")).isTrue(); + } + + @Test + public void should_return_true_when_project_has_a_parent_suffix_and_project_is_on_the_list() { + then(this.versionsFromBom.shouldBeUpdated("foo-parent")).isTrue(); + } + + @Test + public void should_return_true_when_project_has_a_dependencies_suffix_and_project_is_on_the_list() { + then(this.versionsFromBom.shouldBeUpdated("foo-dependencies")).isTrue(); + } + + @Test + public void should_return_false_when_project_is_not_on_the_list() { + then(this.versionsFromBom.shouldBeUpdated("missing")).isFalse(); + } + + @Test + public void should_return_version_for_present_project() { + then(this.versionsFromBom.versionForProject("foo")).isEqualTo("bar"); + } + + @Test + public void should_return_empty_string_for_missing_project() { + then(this.versionsFromBom.versionForProject("missing")).isEmpty(); + } + + @Test + public void should_return_true_if_properties_contains_project_key() { + then(this.versionsFromBom.shouldSetProperty(validProps())).isTrue(); + } + + @Test + public void should_return_false_if_properties_does_not_contain_project_key() { + then(this.versionsFromBom.shouldSetProperty(missingProps())).isFalse(); + } + + @Test + public void should_update_projects_for_boot() { + VersionsFromBom versionsFromBom = mixedVersions().setVersion("spring-boot", + "3.0.0"); + + then(versionsFromBom.versionForProject("spring-boot")).isEqualTo("3.0.0"); + then(versionsFromBom.versionForProject("spring-boot-starter-parent")) + .isEqualTo("3.0.0"); + then(versionsFromBom.versionForProject("spring-boot-dependencies")) + .isEqualTo("3.0.0"); + + versionsFromBom = mixedVersions().setVersion("spring-boot-starter-parent", + "3.0.0"); + + then(versionsFromBom.versionForProject("spring-boot")).isEqualTo("3.0.0"); + then(versionsFromBom.versionForProject("spring-boot-starter-parent")) + .isEqualTo("3.0.0"); + then(versionsFromBom.versionForProject("spring-boot-dependencies")) + .isEqualTo("3.0.0"); + + versionsFromBom = mixedVersions().setVersion("spring-boot-dependencies", "3.0.0"); + + then(versionsFromBom.versionForProject("spring-boot")).isEqualTo("3.0.0"); + then(versionsFromBom.versionForProject("spring-boot-starter-parent")) + .isEqualTo("3.0.0"); + then(versionsFromBom.versionForProject("spring-boot-dependencies")) + .isEqualTo("3.0.0"); + } + + @Test + public void should_update_projects_for_build() { + VersionsFromBom versionsFromBom = mixedVersions().setVersion("spring-cloud-build", + "3.0.0"); + + then(versionsFromBom.versionForProject("spring-cloud-build")).isEqualTo("3.0.0"); + + versionsFromBom = mixedVersions().setVersion("spring-cloud-build", "3.0.0"); + + then(versionsFromBom.versionForProject("spring-cloud-dependencies-parent")) + .isEqualTo("3.0.0"); + then(versionsFromBom.versionForProject("spring-cloud-dependencies")) + .isEqualTo("Greenwich.RELEASE"); + + versionsFromBom = mixedVersions().setVersion("spring-cloud-dependencies-parent", + "3.0.0"); + + then(versionsFromBom.versionForProject("spring-cloud-build")).isEqualTo("3.0.0"); + then(versionsFromBom.versionForProject("spring-cloud-dependencies-parent")) + .isEqualTo("3.0.0"); + then(versionsFromBom.versionForProject("spring-cloud-dependencies")) + .isEqualTo("Greenwich.RELEASE"); + } + + @Test + public void should_update_projects_for_spring_cloud_release() { + VersionsFromBom versionsFromBom = mixedVersions().setVersion("spring-cloud", + "3.0.0"); + + then(versionsFromBom.versionForProject("spring-cloud")).isEqualTo("3.0.0"); + then(versionsFromBom.versionForProject("spring-cloud-release")) + .isEqualTo("3.0.0"); + then(versionsFromBom.versionForProject("spring-cloud-starter")) + .isEqualTo("3.0.0"); + then(versionsFromBom.versionForProject("spring-cloud-dependencies")) + .isEqualTo("3.0.0"); + + versionsFromBom = mixedVersions().setVersion("spring-cloud-release", "3.0.0"); + + then(versionsFromBom.versionForProject("spring-cloud")).isEqualTo("3.0.0"); + then(versionsFromBom.versionForProject("spring-cloud-release")) + .isEqualTo("3.0.0"); + then(versionsFromBom.versionForProject("spring-cloud-starter")) + .isEqualTo("3.0.0"); + then(versionsFromBom.versionForProject("spring-cloud-dependencies")) + .isEqualTo("3.0.0"); + + versionsFromBom = mixedVersions().setVersion("spring-cloud-release", + "Greenwich.SR8"); + + then(versionsFromBom.versionForProject("spring-cloud")) + .isEqualTo("Greenwich.SR8"); + then(versionsFromBom.versionForProject("spring-cloud-release")) + .isEqualTo("Greenwich.SR8"); + then(versionsFromBom.versionForProject("spring-cloud-starter")) + .isEqualTo("Greenwich.SR8"); + then(versionsFromBom.versionForProject("spring-cloud-dependencies")) + .isEqualTo("Greenwich.SR8"); + + versionsFromBom = mixedVersions().setVersion("spring-cloud-dependencies", + "Greenwich.SR8"); + + then(versionsFromBom.versionForProject("spring-cloud")) + .isEqualTo("Greenwich.SR8"); + then(versionsFromBom.versionForProject("spring-cloud-release")) + .isEqualTo("Greenwich.SR8"); + then(versionsFromBom.versionForProject("spring-cloud-starter")) + .isEqualTo("Greenwich.SR8"); + then(versionsFromBom.versionForProject("spring-cloud-dependencies")) + .isEqualTo("Greenwich.SR8"); + } + + @Test + public void should_update_projects_for_custom_bom_only() { + VersionsFromBom versionsFromBom = mixedVersions(customBom()) + .setVersion("spring-cloud", "3.0.0"); + + then(versionsFromBom.versionForProject("spring-cloud")).isEqualTo("3.0.0"); + then(versionsFromBom.versionForProject("spring-cloud-stream-starters")) + .isEqualTo("Fishtown.RELEASE"); + then(versionsFromBom.versionForProject("spring-cloud-starter")).isEmpty(); + then(versionsFromBom.versionForProject("spring-cloud-dependencies")) + .isEqualTo("Greenwich.RELEASE"); + + versionsFromBom = mixedVersions(customBom()) + .setVersion("spring-cloud-stream-starters", "Fishtown.SR4"); + + then(versionsFromBom.versionForProject("spring-cloud")).isEmpty(); + then(versionsFromBom.versionForProject("spring-cloud-stream-starters")) + .isEqualTo("Fishtown.SR4"); + then(versionsFromBom.versionForProject("spring-cloud-starter")).isEmpty(); + then(versionsFromBom.versionForProject("spring-cloud-dependencies")) + .isEqualTo("Greenwich.RELEASE"); + + versionsFromBom = mixedVersions(customBom()).setVersion("spring-cloud-release", + "Greenwich.SR8"); + + then(versionsFromBom.versionForProject("spring-cloud-release")) + .isEqualTo("Greenwich.SR8"); + then(versionsFromBom.versionForProject("spring-cloud-stream-starters")) + .isEqualTo("Fishtown.RELEASE"); + then(versionsFromBom.versionForProject("spring-cloud")).isEmpty(); + then(versionsFromBom.versionForProject("spring-cloud-starter")).isEmpty(); + then(versionsFromBom.versionForProject("spring-cloud-dependencies")) + .isEqualTo("Greenwich.RELEASE"); + + versionsFromBom = mixedVersions(customBom()) + .setVersion("spring-cloud-dependencies", "Greenwich.SR8"); + + then(versionsFromBom.versionForProject("spring-cloud")).isEmpty(); + then(versionsFromBom.versionForProject("spring-cloud-stream-starters")) + .isEqualTo("Fishtown.RELEASE"); + then(versionsFromBom.versionForProject("spring-cloud-starter")).isEmpty(); + then(versionsFromBom.versionForProject("spring-cloud-dependencies")) + .isEqualTo("Greenwich.SR8"); + } + + @Test + public void should_update_projects_for_custom_project() { + VersionsFromBom versionsFromBom = mixedVersions().setVersion("foo", "3.0.0"); + + then(versionsFromBom.versionForProject("foo")).isEqualTo("3.0.0"); + } + + private VersionsFromBom mixedVersions() { + return new VersionsFromBomBuilder().releaserProperties(new ReleaserProperties()) + .parsers(Collections + .singletonList(SpringCloudMavenBomParserAccessor.cloud())) + .projects(mixedProjects()).merged(); + } + + private VersionsFromBom mixedVersions(ReleaserProperties properties) { + return new VersionsFromBomBuilder().releaserProperties(properties) + .projects(mixedProjects()).retrieveFromBom(); + } + + private ReleaserProperties customBom() { + ReleaserProperties properties = new ReleaserProperties(); + properties.getMetaRelease() + .setReleaseTrainDependencyNames(Collections.emptyList()); + properties.getMetaRelease() + .setReleaseTrainProjectName("spring-cloud-stream-starters"); + properties.getPom().setThisTrainBom("spring-cloud-stream-dependencies"); + return properties; + } + + Set projects() { + Set projects = new HashSet<>(); + projects.add(new Project("foo", "bar")); + return projects; + } + + Set mixedProjects() { + Set projects = new HashSet<>(); + projects.add(new Project("foo", "1.0.0.BUILD-SNAPSHOT")); + projects.add(new Project("fooBar", "1.0.0.RELEASE")); + projects.add(new Project("spring-boot", "1.0.0")); + projects.add(new Project("spring-cloud-build", "2.0.0")); + projects.add(new Project("spring-cloud-release", "Greenwich.RELEASE")); + projects.add(new Project("spring-cloud-dependencies", "Greenwich.RELEASE")); + projects.add(new Project("spring-cloud-stream-starters", "Fishtown.RELEASE")); + return projects; + } + + Properties validProps() { + Properties properties = new Properties(); + properties.setProperty("foo.version", "1.0.0"); + return properties; + } + + Properties missingProps() { + Properties properties = new Properties(); + properties.setProperty("missing.version", "1.0.0"); + return properties; + } + +} diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/docs/ReleaseTrainContentsGeneratorTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/docs/ReleaseTrainContentsGeneratorTests.java index 7b92ffc9..dca05753 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/docs/ReleaseTrainContentsGeneratorTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/docs/ReleaseTrainContentsGeneratorTests.java @@ -23,8 +23,8 @@ import org.assertj.core.api.BDDAssertions; import org.junit.Test; import org.springframework.cloud.release.internal.ReleaserProperties; -import org.springframework.cloud.release.internal.pom.ProjectVersion; -import org.springframework.cloud.release.internal.pom.Projects; +import org.springframework.cloud.release.internal.project.ProjectVersion; +import org.springframework.cloud.release.internal.project.Projects; /** * @author Marcin Grzejszczak diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/docs/ReleaseTrainContentsUpdaterTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/docs/ReleaseTrainContentsUpdaterTests.java index 1dec1f7c..cc00da83 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/docs/ReleaseTrainContentsUpdaterTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/docs/ReleaseTrainContentsUpdaterTests.java @@ -29,11 +29,12 @@ import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.springframework.cloud.release.internal.ReleaserProperties; +import org.springframework.cloud.release.internal.buildsystem.TestUtils; import org.springframework.cloud.release.internal.git.GitTestUtils; import org.springframework.cloud.release.internal.git.ProjectGitHandler; -import org.springframework.cloud.release.internal.pom.ProjectVersion; -import org.springframework.cloud.release.internal.pom.Projects; -import org.springframework.cloud.release.internal.pom.TestUtils; +import org.springframework.cloud.release.internal.github.ProjectGitHubHandler; +import org.springframework.cloud.release.internal.project.ProjectVersion; +import org.springframework.cloud.release.internal.project.Projects; import org.springframework.cloud.release.internal.template.TemplateGenerator; import org.springframework.util.FileSystemUtils; @@ -47,15 +48,18 @@ public class ReleaseTrainContentsUpdaterTests { ReleaserProperties properties = new ReleaserProperties(); - ProjectGitHandler projectGitHandler = new ProjectGitHandler(this.properties) { + ProjectGitHubHandler projectGitHubHandler = new ProjectGitHubHandler( + this.properties) { @Override public String milestoneUrl(ProjectVersion releaseVersion) { return "http://www.foo.com/"; } }; + ProjectGitHandler projectGitHandler = new ProjectGitHandler(this.properties); + TemplateGenerator templateGenerator = new TemplateGenerator(this.properties, - this.projectGitHandler); + this.projectGitHubHandler); ReleaseTrainContentsUpdater updater = new ReleaseTrainContentsUpdater(this.properties, this.projectGitHandler, this.templateGenerator); diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/docs/RowTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/docs/RowTests.java index 50ad3e64..190b3369 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/docs/RowTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/docs/RowTests.java @@ -21,8 +21,8 @@ import java.util.List; import org.assertj.core.api.BDDAssertions; import org.junit.Test; -import org.springframework.cloud.release.internal.pom.ProjectVersion; -import org.springframework.cloud.release.internal.pom.Projects; +import org.springframework.cloud.release.internal.project.ProjectVersion; +import org.springframework.cloud.release.internal.project.Projects; /** * @author Marcin Grzejszczak diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/git/GitRepoTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/git/GitRepoTests.java index 4c0ac6d0..614ef566 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/git/GitRepoTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/git/GitRepoTests.java @@ -36,7 +36,7 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; -import org.springframework.cloud.release.internal.pom.TestUtils; +import org.springframework.cloud.release.internal.buildsystem.TestUtils; import static org.assertj.core.api.Assertions.fail; import static org.assertj.core.api.BDDAssertions.then; diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/git/ProjectGitHandlerTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/git/ProjectGitHandlerTests.java index 5278476e..9c875fc6 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/git/ProjectGitHandlerTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/git/ProjectGitHandlerTests.java @@ -25,7 +25,7 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import org.springframework.cloud.release.internal.ReleaserProperties; -import org.springframework.cloud.release.internal.pom.ProjectVersion; +import org.springframework.cloud.release.internal.project.ProjectVersion; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/git/CachingGithubTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/github/CachingGithubTests.java similarity index 99% rename from spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/git/CachingGithubTests.java rename to spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/github/CachingGithubTests.java index ca20da9d..758ac2cf 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/git/CachingGithubTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/github/CachingGithubTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.release.internal.git; +package org.springframework.cloud.release.internal.github; import com.jcabi.github.Coordinates; import com.jcabi.github.Github; diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/git/GithubIssuesTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/github/GithubIssuesTests.java similarity index 97% rename from spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/git/GithubIssuesTests.java rename to spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/github/GithubIssuesTests.java index caca13ec..f4eb4e79 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/git/GithubIssuesTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/github/GithubIssuesTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.release.internal.git; +package org.springframework.cloud.release.internal.github; import java.io.IOException; import java.util.Collections; @@ -33,8 +33,8 @@ import org.mockito.BDDMockito; import org.springframework.boot.test.rule.OutputCapture; import org.springframework.cloud.release.internal.ReleaserProperties; -import org.springframework.cloud.release.internal.pom.ProjectVersion; -import org.springframework.cloud.release.internal.pom.Projects; +import org.springframework.cloud.release.internal.project.ProjectVersion; +import org.springframework.cloud.release.internal.project.Projects; import static org.assertj.core.api.BDDAssertions.then; import static org.assertj.core.api.BDDAssertions.thenThrownBy; diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/git/GithubMilestonesTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/github/GithubMilestonesTests.java similarity index 98% rename from spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/git/GithubMilestonesTests.java rename to spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/github/GithubMilestonesTests.java index 49df2a7f..d9afc0cf 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/git/GithubMilestonesTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/github/GithubMilestonesTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.release.internal.git; +package org.springframework.cloud.release.internal.github; import java.io.IOException; import java.net.URL; @@ -30,7 +30,7 @@ import org.junit.rules.TemporaryFolder; import org.springframework.boot.test.rule.OutputCapture; import org.springframework.cloud.release.internal.ReleaserProperties; -import org.springframework.cloud.release.internal.pom.ProjectVersion; +import org.springframework.cloud.release.internal.project.ProjectVersion; import static org.assertj.core.api.BDDAssertions.then; import static org.assertj.core.api.BDDAssertions.thenThrownBy; diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/gradle/GradleUpdaterTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/gradle/GradleUpdaterTests.java index 0b98b437..1efb5984 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/gradle/GradleUpdaterTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/gradle/GradleUpdaterTests.java @@ -29,8 +29,9 @@ import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.springframework.cloud.release.internal.ReleaserProperties; -import org.springframework.cloud.release.internal.pom.ProjectVersion; -import org.springframework.cloud.release.internal.pom.Projects; +import org.springframework.cloud.release.internal.buildsystem.GradleUpdater; +import org.springframework.cloud.release.internal.project.ProjectVersion; +import org.springframework.cloud.release.internal.project.Projects; import org.springframework.util.FileSystemUtils; import static org.assertj.core.api.BDDAssertions.then; diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/VersionsTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/VersionsTests.java deleted file mode 100644 index eb4cd859..00000000 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/VersionsTests.java +++ /dev/null @@ -1,265 +0,0 @@ -/* - * Copyright 2013-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cloud.release.internal.pom; - -import java.util.Collections; -import java.util.HashSet; -import java.util.Properties; -import java.util.Set; - -import org.junit.Test; - -import org.springframework.cloud.release.internal.ReleaserProperties; - -import static org.assertj.core.api.BDDAssertions.then; - -/** - * @author Marcin Grzejszczak - */ -public class VersionsTests { - - Versions versions = new Versions("", projects()); - - @Test - public void should_add_boot_to_versions_when_version_is_created() { - then(new Versions("1.2.3.RELEASE").projects).contains( - new Project("spring-boot", "1.2.3.RELEASE"), - new Project("spring-boot-starter-parent", "1.2.3.RELEASE"), - new Project("spring-boot-dependencies", "1.2.3.RELEASE")); - } - - @Test - public void should_return_true_when_project_is_on_the_list() { - then(this.versions.shouldBeUpdated("foo")).isTrue(); - } - - @Test - public void should_return_true_when_project_has_a_parent_suffix_and_project_is_on_the_list() { - then(this.versions.shouldBeUpdated("foo-parent")).isTrue(); - } - - @Test - public void should_return_true_when_project_has_a_dependencies_suffix_and_project_is_on_the_list() { - then(this.versions.shouldBeUpdated("foo-dependencies")).isTrue(); - } - - @Test - public void should_return_false_when_project_is_not_on_the_list() { - then(this.versions.shouldBeUpdated("missing")).isFalse(); - } - - @Test - public void should_return_version_for_present_project() { - then(this.versions.versionForProject("foo")).isEqualTo("bar"); - } - - @Test - public void should_return_empty_string_for_missing_project() { - then(this.versions.versionForProject("missing")).isEmpty(); - } - - @Test - public void should_return_true_if_properties_contains_project_key() { - then(this.versions.shouldSetProperty(validProps())).isTrue(); - } - - @Test - public void should_return_false_if_properties_does_not_contain_project_key() { - then(this.versions.shouldSetProperty(missingProps())).isFalse(); - } - - @Test - public void should_update_projects_for_boot() { - Versions versions = mixedVersions().setVersion("spring-boot", "3.0.0"); - - then(versions.versionForProject("spring-boot")).isEqualTo("3.0.0"); - then(versions.versionForProject("spring-boot-starter-parent")).isEqualTo("3.0.0"); - then(versions.versionForProject("spring-boot-dependencies")).isEqualTo("3.0.0"); - - versions = mixedVersions().setVersion("spring-boot-starter-parent", "3.0.0"); - - then(versions.versionForProject("spring-boot")).isEqualTo("3.0.0"); - then(versions.versionForProject("spring-boot-starter-parent")).isEqualTo("3.0.0"); - then(versions.versionForProject("spring-boot-dependencies")).isEqualTo("3.0.0"); - - versions = mixedVersions().setVersion("spring-boot-dependencies", "3.0.0"); - - then(versions.versionForProject("spring-boot")).isEqualTo("3.0.0"); - then(versions.versionForProject("spring-boot-starter-parent")).isEqualTo("3.0.0"); - then(versions.versionForProject("spring-boot-dependencies")).isEqualTo("3.0.0"); - } - - @Test - public void should_update_projects_for_build() { - Versions versions = mixedVersions().setVersion("spring-cloud-build", "3.0.0"); - - then(versions.versionForProject("spring-cloud-build")).isEqualTo("3.0.0"); - - versions = mixedVersions().setVersion("spring-cloud-build", "3.0.0"); - - then(versions.versionForProject("spring-cloud-dependencies-parent")) - .isEqualTo("3.0.0"); - then(versions.versionForProject("spring-cloud-dependencies")) - .isEqualTo("Greenwich.RELEASE"); - - versions = mixedVersions().setVersion("spring-cloud-dependencies-parent", - "3.0.0"); - - then(versions.versionForProject("spring-cloud-build")).isEqualTo("3.0.0"); - then(versions.versionForProject("spring-cloud-dependencies-parent")) - .isEqualTo("3.0.0"); - then(versions.versionForProject("spring-cloud-dependencies")) - .isEqualTo("Greenwich.RELEASE"); - } - - @Test - public void should_update_projects_for_spring_cloud_release() { - Versions versions = mixedVersions().setVersion("spring-cloud", "3.0.0"); - - then(versions.versionForProject("spring-cloud")).isEqualTo("3.0.0"); - then(versions.versionForProject("spring-cloud-release")).isEqualTo("3.0.0"); - then(versions.versionForProject("spring-cloud-starter")).isEqualTo("3.0.0"); - then(versions.versionForProject("spring-cloud-dependencies")).isEqualTo("3.0.0"); - - versions = mixedVersions().setVersion("spring-cloud-release", "3.0.0"); - - then(versions.versionForProject("spring-cloud")).isEqualTo("3.0.0"); - then(versions.versionForProject("spring-cloud-release")).isEqualTo("3.0.0"); - then(versions.versionForProject("spring-cloud-starter")).isEqualTo("3.0.0"); - then(versions.versionForProject("spring-cloud-dependencies")).isEqualTo("3.0.0"); - - versions = mixedVersions().setVersion("spring-cloud-release", "Greenwich.SR8"); - - then(versions.versionForProject("spring-cloud")).isEqualTo("Greenwich.SR8"); - then(versions.versionForProject("spring-cloud-release")) - .isEqualTo("Greenwich.SR8"); - then(versions.versionForProject("spring-cloud-starter")) - .isEqualTo("Greenwich.SR8"); - then(versions.versionForProject("spring-cloud-dependencies")) - .isEqualTo("Greenwich.SR8"); - - versions = mixedVersions().setVersion("spring-cloud-dependencies", - "Greenwich.SR8"); - - then(versions.versionForProject("spring-cloud")).isEqualTo("Greenwich.SR8"); - then(versions.versionForProject("spring-cloud-release")) - .isEqualTo("Greenwich.SR8"); - then(versions.versionForProject("spring-cloud-starter")) - .isEqualTo("Greenwich.SR8"); - then(versions.versionForProject("spring-cloud-dependencies")) - .isEqualTo("Greenwich.SR8"); - } - - @Test - public void should_update_projects_for_custom_bom_only() { - Versions versions = mixedVersions(customBom()).setVersion("spring-cloud", - "3.0.0"); - - then(versions.versionForProject("spring-cloud")).isEqualTo("3.0.0"); - then(versions.versionForProject("spring-cloud-stream-starters")) - .isEqualTo("Fishtown.RELEASE"); - then(versions.versionForProject("spring-cloud-starter")).isEmpty(); - then(versions.versionForProject("spring-cloud-dependencies")) - .isEqualTo("Greenwich.RELEASE"); - - versions = mixedVersions(customBom()).setVersion("spring-cloud-stream-starters", - "Fishtown.SR4"); - - then(versions.versionForProject("spring-cloud")).isEmpty(); - then(versions.versionForProject("spring-cloud-stream-starters")) - .isEqualTo("Fishtown.SR4"); - then(versions.versionForProject("spring-cloud-starter")).isEmpty(); - then(versions.versionForProject("spring-cloud-dependencies")) - .isEqualTo("Greenwich.RELEASE"); - - versions = mixedVersions(customBom()).setVersion("spring-cloud-release", - "Greenwich.SR8"); - - then(versions.versionForProject("spring-cloud-release")) - .isEqualTo("Greenwich.SR8"); - then(versions.versionForProject("spring-cloud-stream-starters")) - .isEqualTo("Fishtown.RELEASE"); - then(versions.versionForProject("spring-cloud")).isEmpty(); - then(versions.versionForProject("spring-cloud-starter")).isEmpty(); - then(versions.versionForProject("spring-cloud-dependencies")) - .isEqualTo("Greenwich.RELEASE"); - - versions = mixedVersions(customBom()).setVersion("spring-cloud-dependencies", - "Greenwich.SR8"); - - then(versions.versionForProject("spring-cloud")).isEmpty(); - then(versions.versionForProject("spring-cloud-stream-starters")) - .isEqualTo("Fishtown.RELEASE"); - then(versions.versionForProject("spring-cloud-starter")).isEmpty(); - then(versions.versionForProject("spring-cloud-dependencies")) - .isEqualTo("Greenwich.SR8"); - } - - @Test - public void should_update_projects_for_custom_project() { - Versions versions = mixedVersions().setVersion("foo", "3.0.0"); - - then(versions.versionForProject("foo")).isEqualTo("3.0.0"); - } - - private Versions mixedVersions() { - return new Versions("1.0.0", "2.0.0", mixedProjects()); - } - - private Versions mixedVersions(ReleaserProperties properties) { - return new Versions(properties, "1.0.0", "2.0.0", mixedProjects()); - } - - private ReleaserProperties customBom() { - ReleaserProperties properties = new ReleaserProperties(); - properties.getMetaRelease() - .setReleaseTrainDependencyNames(Collections.emptyList()); - properties.getMetaRelease() - .setReleaseTrainProjectName("spring-cloud-stream-starters"); - properties.getPom().setThisTrainBom("spring-cloud-stream-dependencies"); - return properties; - } - - Set projects() { - Set projects = new HashSet<>(); - projects.add(new Project("foo", "bar")); - return projects; - } - - Set mixedProjects() { - Set projects = new HashSet<>(); - projects.add(new Project("foo", "1.0.0.BUILD-SNAPSHOT")); - projects.add(new Project("fooBar", "1.0.0.RELEASE")); - projects.add(new Project("spring-cloud-release", "Greenwich.RELEASE")); - projects.add(new Project("spring-cloud-dependencies", "Greenwich.RELEASE")); - projects.add(new Project("spring-cloud-stream-starters", "Fishtown.RELEASE")); - return projects; - } - - Properties validProps() { - Properties properties = new Properties(); - properties.setProperty("foo.version", "1.0.0"); - return properties; - } - - Properties missingProps() { - Properties properties = new Properties(); - properties.setProperty("missing.version", "1.0.0"); - return properties; - } - -} diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/post/PostReleaseActionsTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/postrelease/PostReleaseActionsTests.java similarity index 90% rename from spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/post/PostReleaseActionsTests.java rename to spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/postrelease/PostReleaseActionsTests.java index f1a9b8a5..5441a3b4 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/post/PostReleaseActionsTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/postrelease/PostReleaseActionsTests.java @@ -14,10 +14,11 @@ * limitations under the License. */ -package org.springframework.cloud.release.internal.post; +package org.springframework.cloud.release.internal.postrelease; import java.io.File; import java.net.URISyntaxException; +import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -37,16 +38,16 @@ import org.mockito.BDDMockito; import org.springframework.cloud.release.internal.PomUpdateAcceptanceTests; import org.springframework.cloud.release.internal.ReleaserProperties; +import org.springframework.cloud.release.internal.buildsystem.GradleUpdater; +import org.springframework.cloud.release.internal.buildsystem.ProjectPomUpdater; +import org.springframework.cloud.release.internal.buildsystem.TestUtils; import org.springframework.cloud.release.internal.git.GitTestUtils; import org.springframework.cloud.release.internal.git.ProjectGitHandler; -import org.springframework.cloud.release.internal.gradle.GradleUpdater; -import org.springframework.cloud.release.internal.pom.ProcessedProject; -import org.springframework.cloud.release.internal.pom.ProjectPomUpdater; -import org.springframework.cloud.release.internal.pom.ProjectVersion; -import org.springframework.cloud.release.internal.pom.Projects; -import org.springframework.cloud.release.internal.pom.TestPomReader; -import org.springframework.cloud.release.internal.pom.TestUtils; -import org.springframework.cloud.release.internal.project.ProjectBuilder; +import org.springframework.cloud.release.internal.project.ProcessedProject; +import org.springframework.cloud.release.internal.project.ProjectCommandExecutor; +import org.springframework.cloud.release.internal.project.ProjectVersion; +import org.springframework.cloud.release.internal.project.Projects; +import org.springframework.cloud.release.internal.tech.PomReader; import org.springframework.cloud.release.internal.versions.VersionsFetcher; import org.springframework.util.FileSystemUtils; import org.springframework.util.LinkedMultiValueMap; @@ -61,8 +62,6 @@ public class PostReleaseActionsTests { File temporaryFolder; - TestPomReader testPomReader = new TestPomReader(); - GradleUpdater gradleUpdater = BDDMockito.mock(GradleUpdater.class); ReleaserProperties properties = new ReleaserProperties(); @@ -92,11 +91,11 @@ public class PostReleaseActionsTests { } }; - ProjectPomUpdater updater = new ProjectPomUpdater(this.properties); + ProjectPomUpdater updater = new ProjectPomUpdater(this.properties, new ArrayList<>()); VersionsFetcher versionsFetcher = new VersionsFetcher(properties, updater); - ProjectBuilder builder = new ProjectBuilder(this.properties); + ProjectCommandExecutor builder = new ProjectCommandExecutor(this.properties); @Before public void setup() throws Exception { @@ -143,7 +142,7 @@ public class PostReleaseActionsTests { actions.runUpdatedTests(currentGa()); - Model rootPom = this.testPomReader.readPom(new File(this.cloned, "pom.xml")); + Model rootPom = PomReader.readPom(new File(this.cloned, "pom.xml")); BDDAssertions.then(rootPom.getVersion()).isEqualTo("Finchley.SR1"); BDDAssertions.then(rootPom.getParent().getVersion()).isEqualTo("2.0.4.RELEASE"); BDDAssertions.then(sleuthParentPomVersion()).isEqualTo("2.0.4.RELEASE"); @@ -186,15 +185,14 @@ public class PostReleaseActionsTests { this.properties.getMetaRelease().setEnabled(true); this.properties.getGit().setReleaseTrainDocsUrl( tmpFile("spring-cloud-core-tests/").getAbsolutePath() + "/"); - this.properties.getMaven() - .setGenerateReleaseTrainDocsCommand("touch generate.log"); + this.properties.getMaven().setGenerateReleaseTrainDocsCommand("./test.sh"); PostReleaseActions actions = new PostReleaseActions(this.projectGitHandler, this.updater, this.gradleUpdater, this.builder, this.properties, versionsFetcher); actions.generateReleaseTrainDocumentation(currentGa()); - Model rootPom = this.testPomReader.readPom(new File(this.cloned, "pom.xml")); + Model rootPom = PomReader.readPom(new File(this.cloned, "pom.xml")); BDDAssertions.then(rootPom.getVersion()).isEqualTo("Finchley.SR1"); BDDAssertions.then(rootPom.getParent().getVersion()).isEqualTo("2.0.4.RELEASE"); BDDAssertions.then(sleuthParentPomVersion()).isEqualTo("2.0.4.RELEASE"); @@ -253,7 +251,7 @@ public class PostReleaseActionsTests { .filter(s -> s.getKey().contains("spring-cloud-core-tests")).findFirst() .orElseThrow(() -> new IllegalStateException("Not found")); File clonedFile = entry.getValue().get(0); - Model pomWithCloud = this.testPomReader + Model pomWithCloud = PomReader .readPom(new File(clonedFile, "zuul-proxy-eureka/pom.xml")); Git git = GitTestUtils.openGitProject(clonedFile); BDDAssertions @@ -318,15 +316,16 @@ public class PostReleaseActionsTests { this.properties.getMetaRelease().setGitOrgUrl(projects); VersionsFetcher versionsFetcher = BDDMockito.mock(VersionsFetcher.class); BDDMockito.given(versionsFetcher.isLatestGa(BDDMockito.any())).willReturn(true); - AtomicReference projectBuilderStub = new AtomicReference<>(); + AtomicReference projectBuilderStub = new AtomicReference<>(); ProjectGitHandler handler = BDDMockito.mock(ProjectGitHandler.class); - ProjectBuilder projectBuilder = BDDMockito.mock(ProjectBuilder.class); + ProjectCommandExecutor projectCommandExecutor = BDDMockito + .mock(ProjectCommandExecutor.class); PostReleaseActions actions = new PostReleaseActions(handler, this.updater, this.gradleUpdater, this.builder, this.properties, versionsFetcher) { @Override - ProjectBuilder projectBuilder(ProcessedProject processedProject) { - projectBuilderStub.set(projectBuilder); - return projectBuilder; + ProjectCommandExecutor projectBuilder(ProcessedProject processedProject) { + projectBuilderStub.set(projectCommandExecutor); + return projectCommandExecutor; } }; ProjectVersion projectVersion = new ProjectVersion( @@ -343,8 +342,8 @@ public class PostReleaseActionsTests { } private String sleuthParentPomVersion() { - return this.testPomReader.readPom(new File(this.cloned, "sleuth/pom.xml")) - .getParent().getVersion(); + return PomReader.readPom(new File(this.cloned, "sleuth/pom.xml")).getParent() + .getVersion(); } Projects currentGa() { diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/project/ProjectBuilderTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/project/ProjectCommandExecutorTests.java similarity index 70% rename from spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/project/ProjectBuilderTests.java rename to spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/project/ProjectCommandExecutorTests.java index 5e5ac059..9c0fb29e 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/project/ProjectBuilderTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/project/ProjectCommandExecutorTests.java @@ -32,8 +32,7 @@ import org.junit.rules.TemporaryFolder; import org.springframework.boot.test.rule.OutputCapture; import org.springframework.cloud.release.internal.PomUpdateAcceptanceTests; import org.springframework.cloud.release.internal.ReleaserProperties; -import org.springframework.cloud.release.internal.pom.ProjectVersion; -import org.springframework.cloud.release.internal.pom.TestUtils; +import org.springframework.cloud.release.internal.buildsystem.TestUtils; import org.springframework.util.FileSystemUtils; import static org.assertj.core.api.BDDAssertions.then; @@ -42,7 +41,7 @@ import static org.assertj.core.api.BDDAssertions.thenThrownBy; /** * @author Marcin Grzejszczak */ -public class ProjectBuilderTests { +public class ProjectCommandExecutorTests { @Rule public TemporaryFolder tmp = new TemporaryFolder(); @@ -60,8 +59,8 @@ public class ProjectBuilderTests { FileSystemUtils.copyRecursively(file("/projects"), this.temporaryFolder); } - ProjectBuilder projectBuilder(ReleaserProperties properties) { - return new ProjectBuilder(properties) { + ProjectCommandExecutor projectBuilder(ReleaserProperties properties) { + return new ProjectCommandExecutor(properties) { @Override ProcessExecutor executor(String workingDir) { return testExecutor(workingDir); @@ -73,9 +72,9 @@ public class ProjectBuilderTests { public void should_successfully_execute_a_command_when_after_running_there_is_no_html_file_with_unresolved_tag() throws Exception { ReleaserProperties properties = new ReleaserProperties(); - properties.getMaven().setBuildCommand("ls -al"); + properties.getBash().setBuildCommand("ls -al"); properties.setWorkingDir(tmpFile("/builder/resolved").getPath()); - ProjectBuilder builder = projectBuilder(properties); + ProjectCommandExecutor builder = projectBuilder(properties); builder.build(new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT")); @@ -87,9 +86,9 @@ public class ProjectBuilderTests { public void should_successfully_execute_a_command_when_path_is_provided_explicitly() throws Exception { ReleaserProperties properties = new ReleaserProperties(); - properties.getMaven().setBuildCommand("ls -al"); + properties.getBash().setBuildCommand("ls -al"); properties.setWorkingDir(new File("/foo/bar").getAbsolutePath()); - ProjectBuilder builder = projectBuilder(properties); + ProjectCommandExecutor builder = projectBuilder(properties); builder.build(new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"), tmpFile("/builder/resolved").getPath()); @@ -102,66 +101,63 @@ public class ProjectBuilderTests { public void should_successfully_execute_a_build_command_for_milestone_version() throws Exception { ReleaserProperties properties = new ReleaserProperties(); - properties.getMaven().setBuildCommand("echo foo"); + properties.getBash().setBuildCommand("echo foo"); properties.setWorkingDir(tmpFile("/builder/resolved").getPath()); - ProjectBuilder builder = projectBuilder(properties); + ProjectCommandExecutor builder = projectBuilder(properties); builder.build(new ProjectVersion("foo", "1.0.0.M1")); - then(asString(tmpFile("/builder/resolved/resolved.log"))) - .contains("foo -Pmilestone"); + then(asString(tmpFile("/builder/resolved/resolved.log"))).contains("foo"); } @Test public void should_successfully_execute_a_build_command_for_rc_version() throws Exception { ReleaserProperties properties = new ReleaserProperties(); - properties.getMaven().setBuildCommand("echo foo"); + properties.getBash().setBuildCommand("echo foo"); properties.setWorkingDir(tmpFile("/builder/resolved").getPath()); - ProjectBuilder builder = projectBuilder(properties); + ProjectCommandExecutor builder = projectBuilder(properties); builder.build(new ProjectVersion("foo", "1.0.0.RC1")); - then(asString(tmpFile("/builder/resolved/resolved.log"))) - .contains("foo -Pmilestone").doesNotContain("-Pguides"); + then(asString(tmpFile("/builder/resolved/resolved.log"))).contains("foo") + .doesNotContain("-Pguides"); } @Test public void should_successfully_execute_a_build_command_for_release_version() throws Exception { ReleaserProperties properties = new ReleaserProperties(); - properties.getMaven().setBuildCommand("echo foo"); + properties.getBash().setBuildCommand("echo foo"); properties.setWorkingDir(tmpFile("/builder/resolved").getPath()); - ProjectBuilder builder = projectBuilder(properties); + ProjectCommandExecutor builder = projectBuilder(properties); builder.build(new ProjectVersion("foo", "1.0.0.RELEASE")); - then(asString(tmpFile("/builder/resolved/resolved.log"))) - .contains("foo -Pcentral"); + then(asString(tmpFile("/builder/resolved/resolved.log"))).contains("foo"); } @Test public void should_successfully_execute_a_build_command_for_sr_version() throws Exception { ReleaserProperties properties = new ReleaserProperties(); - properties.getMaven().setBuildCommand("echo foo"); + properties.getBash().setBuildCommand("echo foo"); properties.setWorkingDir(tmpFile("/builder/resolved").getPath()); - ProjectBuilder builder = projectBuilder(properties); + ProjectCommandExecutor builder = projectBuilder(properties); builder.build(new ProjectVersion("foo", "1.0.0.SR1")); - then(asString(tmpFile("/builder/resolved/resolved.log"))) - .contains("foo -Pcentral"); + then(asString(tmpFile("/builder/resolved/resolved.log"))).contains("foo"); } @Test public void should_successfully_execute_a_command_when_system_props_placeholder_is_present() throws Exception { ReleaserProperties properties = new ReleaserProperties(); - properties.getMaven().setBuildCommand("echo {{systemProps}}"); - properties.getMaven().setSystemProperties("-Dhello=world -Dfoo=bar"); + properties.getBash().setBuildCommand("echo {{systemProps}}"); + properties.getBash().setSystemProperties("-Dhello=world -Dfoo=bar"); properties.setWorkingDir(tmpFile("/builder/resolved").getPath()); - ProjectBuilder builder = projectBuilder(properties); + ProjectCommandExecutor builder = projectBuilder(properties); builder.build(new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT")); @@ -173,9 +169,9 @@ public class ProjectBuilderTests { public void should_successfully_execute_a_command_when_system_props_placeholder_is_present_and_there_are_no_sys_props() throws Exception { ReleaserProperties properties = new ReleaserProperties(); - properties.getMaven().setBuildCommand("echo foo {{systemProps}}"); + properties.getBash().setBuildCommand("echo foo {{systemProps}}"); properties.setWorkingDir(tmpFile("/builder/resolved").getPath()); - ProjectBuilder builder = projectBuilder(properties); + ProjectCommandExecutor builder = projectBuilder(properties); builder.build(new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT")); @@ -186,10 +182,10 @@ public class ProjectBuilderTests { public void should_successfully_execute_a_command_when_system_props_placeholder_is_present_without_system_props() throws Exception { ReleaserProperties properties = new ReleaserProperties(); - properties.getMaven().setBuildCommand("echo {{systemProps}}"); - properties.getMaven().setSystemProperties("hello=world foo=bar"); + properties.getBash().setBuildCommand("echo {{systemProps}}"); + properties.getBash().setSystemProperties("hello=world foo=bar"); properties.setWorkingDir(tmpFile("/builder/resolved").getPath()); - ProjectBuilder builder = projectBuilder(properties); + ProjectCommandExecutor builder = projectBuilder(properties); builder.build(new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT")); @@ -201,10 +197,10 @@ public class ProjectBuilderTests { public void should_successfully_execute_a_command_when_system_props_placeholder_is_present_inside_command() throws Exception { ReleaserProperties properties = new ReleaserProperties(); - properties.getMaven().setBuildCommand("echo {{systemProps}} bar"); - properties.getMaven().setSystemProperties("-Dhello=world -Dfoo=bar"); + properties.getBash().setBuildCommand("echo {{systemProps}} bar"); + properties.getBash().setSystemProperties("-Dhello=world -Dfoo=bar"); properties.setWorkingDir(tmpFile("/builder/resolved").getPath()); - ProjectBuilder builder = projectBuilder(properties); + ProjectCommandExecutor builder = projectBuilder(properties); builder.build(new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT")); @@ -216,10 +212,10 @@ public class ProjectBuilderTests { public void should_successfully_pass_system_props_when_build_gets_executed_without_explicit_system_props() throws Exception { ReleaserProperties properties = new ReleaserProperties(); - properties.getMaven().setBuildCommand("echo bar"); - properties.getMaven().setSystemProperties("-Dhello=world -Dfoo=bar"); + properties.getBash().setBuildCommand("echo bar"); + properties.getBash().setSystemProperties("-Dhello=world -Dfoo=bar"); properties.setWorkingDir(tmpFile("/builder/resolved").getPath()); - ProjectBuilder builder = projectBuilder(properties); + ProjectCommandExecutor builder = projectBuilder(properties); builder.build(new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT")); @@ -230,9 +226,9 @@ public class ProjectBuilderTests { @Test public void should_throw_exception_when_after_running_there_is_an_html_file_with_unresolved_tag() { ReleaserProperties properties = new ReleaserProperties(); - properties.getMaven().setBuildCommand("ls -al"); + properties.getBash().setBuildCommand("ls -al"); properties.setWorkingDir(tmpFile("/builder/unresolved").getPath()); - ProjectBuilder builder = projectBuilder(properties); + ProjectCommandExecutor builder = projectBuilder(properties); thenThrownBy( () -> builder.build(new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"))) @@ -243,10 +239,10 @@ public class ProjectBuilderTests { @Test public void should_throw_exception_when_command_took_too_long_to_execute() { ReleaserProperties properties = new ReleaserProperties(); - properties.getMaven().setBuildCommand("sleep 1"); - properties.getMaven().setWaitTimeInMinutes(0); + properties.getBash().setBuildCommand("sleep 1"); + properties.getBash().setWaitTimeInMinutes(0); properties.setWorkingDir(tmpFile("/builder/unresolved").getPath()); - ProjectBuilder builder = projectBuilder(properties); + ProjectCommandExecutor builder = projectBuilder(properties); thenThrownBy( () -> builder.build(new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"))) @@ -257,9 +253,9 @@ public class ProjectBuilderTests { @Test public void should_successfully_execute_a_deploy_command() throws Exception { ReleaserProperties properties = new ReleaserProperties(); - properties.getMaven().setDeployCommand("ls -al"); + properties.getBash().setDeployCommand("ls -al"); properties.setWorkingDir(tmpFile("/builder/resolved").getPath()); - ProjectBuilder builder = projectBuilder(properties); + ProjectCommandExecutor builder = projectBuilder(properties); builder.deploy(new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT")); @@ -271,9 +267,25 @@ public class ProjectBuilderTests { public void should_successfully_execute_a_deploy_command_for_milestone_version() throws Exception { ReleaserProperties properties = new ReleaserProperties(); + properties.getBash().setDeployCommand("echo foo"); + properties.setWorkingDir(tmpFile("/builder/resolved").getPath()); + ProjectCommandExecutor builder = projectBuilder(properties); + + builder.deploy(new ProjectVersion("foo", "1.0.0.M1")); + + then(asString(tmpFile("/builder/resolved/resolved.log"))).contains("foo") + .doesNotContain("-Pguides"); + } + + @Test + public void should_successfully_execute_a_deploy_command_for_milestone_version_for_maven() + throws Exception { + ReleaserProperties properties = new ReleaserProperties(); properties.getMaven().setDeployCommand("echo foo"); properties.setWorkingDir(tmpFile("/builder/resolved").getPath()); - ProjectBuilder builder = projectBuilder(properties); + new ProcessExecutor(properties.getWorkingDir()) + .runCommand(new String[] { "touch", "pom.xml" }, 1); + ProjectCommandExecutor builder = projectBuilder(properties); builder.deploy(new ProjectVersion("foo", "1.0.0.M1")); @@ -285,9 +297,25 @@ public class ProjectBuilderTests { public void should_successfully_execute_a_deploy_command_for_rc_version() throws Exception { ReleaserProperties properties = new ReleaserProperties(); + properties.getBash().setDeployCommand("echo foo"); + properties.setWorkingDir(tmpFile("/builder/resolved").getPath()); + ProjectCommandExecutor builder = projectBuilder(properties); + + builder.deploy(new ProjectVersion("foo", "1.0.0.RC1")); + + then(asString(tmpFile("/builder/resolved/resolved.log"))).contains("foo") + .doesNotContain("-Pguides"); + } + + @Test + public void should_successfully_execute_a_deploy_command_for_rc_version_for_maven() + throws Exception { + ReleaserProperties properties = new ReleaserProperties(); properties.getMaven().setDeployCommand("echo foo"); properties.setWorkingDir(tmpFile("/builder/resolved").getPath()); - ProjectBuilder builder = projectBuilder(properties); + new ProcessExecutor(properties.getWorkingDir()) + .runCommand(new String[] { "touch", "pom.xml" }, 1); + ProjectCommandExecutor builder = projectBuilder(properties); builder.deploy(new ProjectVersion("foo", "1.0.0.RC1")); @@ -299,9 +327,24 @@ public class ProjectBuilderTests { public void should_successfully_execute_a_deploy_command_for_release_version() throws Exception { ReleaserProperties properties = new ReleaserProperties(); + properties.getBash().setDeployCommand("echo foo"); + properties.setWorkingDir(tmpFile("/builder/resolved").getPath()); + ProjectCommandExecutor builder = projectBuilder(properties); + + builder.deploy(new ProjectVersion("foo", "1.0.0.RELEASE")); + + then(asString(tmpFile("/builder/resolved/resolved.log"))).contains("foo"); + } + + @Test + public void should_successfully_execute_a_deploy_command_for_release_version_for_maven() + throws Exception { + ReleaserProperties properties = new ReleaserProperties(); properties.getMaven().setDeployCommand("echo foo"); properties.setWorkingDir(tmpFile("/builder/resolved").getPath()); - ProjectBuilder builder = projectBuilder(properties); + new ProcessExecutor(properties.getWorkingDir()) + .runCommand(new String[] { "touch", "pom.xml" }, 1); + ProjectCommandExecutor builder = projectBuilder(properties); builder.deploy(new ProjectVersion("foo", "1.0.0.RELEASE")); @@ -313,24 +356,23 @@ public class ProjectBuilderTests { public void should_successfully_execute_a_deploy_command_for_sr_version() throws Exception { ReleaserProperties properties = new ReleaserProperties(); - properties.getMaven().setDeployCommand("echo foo"); + properties.getBash().setDeployCommand("echo foo"); properties.setWorkingDir(tmpFile("/builder/resolved").getPath()); - ProjectBuilder builder = projectBuilder(properties); + ProjectCommandExecutor builder = projectBuilder(properties); builder.deploy(new ProjectVersion("foo", "1.0.0.SR1")); - then(asString(tmpFile("/builder/resolved/resolved.log"))) - .contains("foo -Pcentral"); + then(asString(tmpFile("/builder/resolved/resolved.log"))).contains("foo"); } @Test public void should_successfully_execute_a_deploy_command_with_sys_props_placeholder() throws Exception { ReleaserProperties properties = new ReleaserProperties(); - properties.getMaven().setDeployCommand("echo \"{{systemProps}}\""); - properties.getMaven().setSystemProperties("-Dhello=hello-world"); + properties.getBash().setDeployCommand("echo \"{{systemProps}}\""); + properties.getBash().setSystemProperties("-Dhello=hello-world"); properties.setWorkingDir(tmpFile("/builder/resolved").getPath()); - ProjectBuilder builder = projectBuilder(properties); + ProjectCommandExecutor builder = projectBuilder(properties); builder.deploy(new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT")); @@ -342,10 +384,10 @@ public class ProjectBuilderTests { public void should_successfully_pass_system_props_when_deploy_gets_executed_without_explicit_system_props() throws Exception { ReleaserProperties properties = new ReleaserProperties(); - properties.getMaven().setDeployCommand("echo "); - properties.getMaven().setSystemProperties("-Dhello=hello-world"); + properties.getBash().setDeployCommand("echo "); + properties.getBash().setSystemProperties("-Dhello=hello-world"); properties.setWorkingDir(tmpFile("/builder/resolved").getPath()); - ProjectBuilder builder = projectBuilder(properties); + ProjectCommandExecutor builder = projectBuilder(properties); builder.deploy(new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT")); @@ -356,10 +398,10 @@ public class ProjectBuilderTests { @Test public void should_throw_exception_when_deploy_command_took_too_long_to_execute() { ReleaserProperties properties = new ReleaserProperties(); - properties.getMaven().setDeployCommand("sleep 1"); - properties.getMaven().setWaitTimeInMinutes(0); + properties.getBash().setDeployCommand("sleep 1"); + properties.getBash().setWaitTimeInMinutes(0); properties.setWorkingDir(tmpFile("/builder/unresolved").getPath()); - ProjectBuilder builder = projectBuilder(properties); + ProjectCommandExecutor builder = projectBuilder(properties); thenThrownBy( () -> builder.deploy(new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"))) @@ -370,10 +412,10 @@ public class ProjectBuilderTests { @Test public void should_successfully_execute_a_publish_docs_command() throws Exception { ReleaserProperties properties = new ReleaserProperties(); - properties.getMaven().setPublishDocsCommands(new String[] { "ls -al", "ls -al" }); + properties.getBash().setPublishDocsCommands(new String[] { "ls -al", "ls -al" }); properties.setWorkingDir(tmpFile("/builder/resolved").getPath()); TestProcessExecutor executor = testExecutor(properties.getWorkingDir()); - ProjectBuilder builder = new ProjectBuilder(properties) { + ProjectCommandExecutor builder = new ProjectCommandExecutor(properties) { @Override ProcessExecutor executor(String workingDir) { return executor; @@ -391,12 +433,12 @@ public class ProjectBuilderTests { public void should_successfully_execute_a_publish_docs_command_with_sys_props_placeholder() throws Exception { ReleaserProperties properties = new ReleaserProperties(); - properties.getMaven().setPublishDocsCommands( + properties.getBash().setPublishDocsCommands( new String[] { "echo {{systemProps}} 1", "echo {{systemProps}} 2" }); - properties.getMaven().setSystemProperties("-Dhello=world -Dfoo=bar"); + properties.getBash().setSystemProperties("-Dhello=world -Dfoo=bar"); properties.setWorkingDir(tmpFile("/builder/resolved").getPath()); TestProcessExecutor executor = testExecutor(properties.getWorkingDir()); - ProjectBuilder builder = new ProjectBuilder(properties) { + ProjectCommandExecutor builder = new ProjectCommandExecutor(properties) { @Override ProcessExecutor executor(String workingDir) { return executor; @@ -414,11 +456,11 @@ public class ProjectBuilderTests { public void should_successfully_execute_a_publish_docs_command_and_substitute_the_version() throws Exception { ReleaserProperties properties = new ReleaserProperties(); - properties.getMaven() + properties.getBash() .setPublishDocsCommands(new String[] { "echo '{{version}}'" }); properties.setWorkingDir(tmpFile("/builder/resolved").getPath()); TestProcessExecutor executor = testExecutor(properties.getWorkingDir()); - ProjectBuilder builder = new ProjectBuilder(properties) { + ProjectCommandExecutor builder = new ProjectCommandExecutor(properties) { @Override ProcessExecutor executor(String workingDir) { return executor; @@ -435,11 +477,11 @@ public class ProjectBuilderTests { public void should_successfully_execute_an_update_docs_command_and_substitute_the_version() throws Exception { ReleaserProperties properties = new ReleaserProperties(); - properties.getMaven().setGenerateReleaseTrainDocsCommand("echo '{{version}}'"); + properties.getBash().setGenerateReleaseTrainDocsCommand("echo '{{version}}'"); File resolved = tmpFile("/builder/resolved"); properties.setWorkingDir(resolved.getPath()); TestProcessExecutor executor = testExecutor(properties.getWorkingDir()); - ProjectBuilder builder = new ProjectBuilder(properties) { + ProjectCommandExecutor builder = new ProjectCommandExecutor(properties) { @Override ProcessExecutor executor(String workingDir) { return executor; @@ -455,11 +497,11 @@ public class ProjectBuilderTests { @Test public void should_throw_exception_when_publish_docs_command_took_too_long_to_execute() { ReleaserProperties properties = new ReleaserProperties(); - properties.getMaven() + properties.getBash() .setPublishDocsCommands(new String[] { "sleep 1", "sleep 1" }); - properties.getMaven().setWaitTimeInMinutes(0); + properties.getBash().setWaitTimeInMinutes(0); properties.setWorkingDir(tmpFile("/builder/unresolved").getPath()); - ProjectBuilder builder = projectBuilder(properties); + ProjectCommandExecutor builder = projectBuilder(properties); thenThrownBy(() -> builder.publishDocs("")) .hasMessageContaining("Process waiting time of [0] minutes exceeded"); @@ -468,9 +510,9 @@ public class ProjectBuilderTests { @Test public void should_throw_exception_when_process_exits_with_invalid_code() { ReleaserProperties properties = new ReleaserProperties(); - properties.getMaven().setBuildCommand("exit 1"); + properties.getBash().setBuildCommand("exit 1"); properties.setWorkingDir(tmpFile("/builder/unresolved").getPath()); - ProjectBuilder builder = new ProjectBuilder(properties) { + ProjectCommandExecutor builder = new ProjectCommandExecutor(properties) { @Override ProcessExecutor executor(String workingDir) { return new ProcessExecutor(properties.getWorkingDir()) { diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/sagan/SaganUpdaterTest.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/sagan/SaganUpdaterTest.java index 0d8603a2..709cdc1f 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/sagan/SaganUpdaterTest.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/sagan/SaganUpdaterTest.java @@ -31,7 +31,7 @@ import org.mockito.BDDMockito; import org.mockito.Mockito; import org.springframework.cloud.release.internal.ReleaserProperties; -import org.springframework.cloud.release.internal.pom.ProjectVersion; +import org.springframework.cloud.release.internal.project.ProjectVersion; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.BDDMockito.given; diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/template/TemplateGeneratorTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/template/TemplateGeneratorTests.java index 4e91f8ed..4f5993a8 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/template/TemplateGeneratorTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/template/TemplateGeneratorTests.java @@ -24,9 +24,9 @@ import java.util.HashSet; import org.junit.Test; import org.springframework.cloud.release.internal.ReleaserProperties; -import org.springframework.cloud.release.internal.git.ProjectGitHandler; -import org.springframework.cloud.release.internal.pom.ProjectVersion; -import org.springframework.cloud.release.internal.pom.Projects; +import org.springframework.cloud.release.internal.github.ProjectGitHubHandler; +import org.springframework.cloud.release.internal.project.ProjectVersion; +import org.springframework.cloud.release.internal.project.Projects; import static org.assertj.core.api.BDDAssertions.then; @@ -37,7 +37,7 @@ public class TemplateGeneratorTests { ReleaserProperties props = new ReleaserProperties(); - ProjectGitHandler handler = new ProjectGitHandler(this.props) { + ProjectGitHubHandler handler = new ProjectGitHubHandler(this.props) { @Override public String milestoneUrl(ProjectVersion releaseVersion) { if (releaseVersion.projectName.equals("spring-cloud-foo")) { @@ -118,8 +118,8 @@ public class TemplateGeneratorTests { .contains("The release can be found in [Maven Central]") .contains("### Spring Cloud Sleuth") .contains( - "| Spring Cloud Sleuth | 1.0.0.RELEASE | ([issues](https://foo.bar.com))") - .contains("| Spring Cloud Foo\t| 1.0.2.RELEASE\t|  ") + "| Spring Cloud Sleuth | 1.0.0.RELEASE | ([issues](https://foo.bar.com))") + .contains("| Spring Cloud Foo | 1.0.2.RELEASE |  ") .contains("Dalston.RELEASE").contains( "mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Dalston.RELEASE'"); } @@ -143,7 +143,7 @@ public class TemplateGeneratorTests { .contains("The release can be found in [Maven Central]") .contains("### Spring Cloud Sleuth") .contains( - "| Spring Cloud Sleuth\t| 1.0.0.RELEASE\t| ([issues](https://foo.bar.com))") + "| Spring Cloud Sleuth | 1.0.0.RELEASE | ([issues](https://foo.bar.com))") .contains("Dalston.RELEASE").contains( "mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Dalston.RELEASE'"); } @@ -167,7 +167,7 @@ public class TemplateGeneratorTests { .contains("The release can be found in [Maven Central]") .contains("### Spring Cloud Sleuth") .contains( - "| Spring Cloud Sleuth | 1.0.0.RELEASE | ([issues](https://foo.bar.com))") + "| Spring Cloud Sleuth | 1.0.0.RELEASE | ([issues](https://foo.bar.com))") .contains("Dalston.SR1").contains( "mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Dalston.SR1'"); } @@ -191,7 +191,7 @@ public class TemplateGeneratorTests { .contains("The release can be found in [Maven Central]") .contains("### Spring Cloud Sleuth") .contains( - "| Spring Cloud Sleuth | 1.0.0.RELEASE | ([issues](https://foo.bar.com))") + "| Spring Cloud Sleuth | 1.0.0.RELEASE | ([issues](https://foo.bar.com))") .contains("Dalston.SR1").contains( "mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Dalston.SR1'"); } @@ -215,7 +215,7 @@ public class TemplateGeneratorTests { .contains("The release can be found in [Spring Milestone]") .contains("### Spring Cloud Sleuth") .contains( - "| Spring Cloud Sleuth\t| 1.0.0.M1\t| ([issues](https://foo.bar.com))") + "| Spring Cloud Sleuth | 1.0.0.M1 | ([issues](https://foo.bar.com))") .contains("spring-milestones") .contains("url 'https://repo.spring.io/milestone'") .contains("Dalston.M1").contains( @@ -241,7 +241,7 @@ public class TemplateGeneratorTests { .contains("The release can be found in [Spring Milestone]") .contains("### Spring Cloud Sleuth") .contains( - "| Spring Cloud Sleuth\t| 1.0.0.M1\t| ([issues](https://foo.bar.com))") + "| Spring Cloud Sleuth | 1.0.0.M1 | ([issues](https://foo.bar.com))") .contains("spring-milestones") .contains("url 'https://repo.spring.io/milestone'") .contains("Dalston.M1").contains( @@ -267,7 +267,7 @@ public class TemplateGeneratorTests { .contains("The release can be found in [Spring Milestone]") .contains("### Spring Cloud Sleuth") .contains( - "| Spring Cloud Sleuth\t| 1.0.0.RC1\t| ([issues](https://foo.bar.com))") + "| Spring Cloud Sleuth | 1.0.0.RC1 | ([issues](https://foo.bar.com))") .contains("spring-milestones") .contains("url 'https://repo.spring.io/milestone'") .contains("Dalston.RC1").contains( @@ -293,7 +293,7 @@ public class TemplateGeneratorTests { .contains("The release can be found in [Spring Milestone]") .contains("### Spring Cloud Sleuth") .contains( - "| Spring Cloud Sleuth\t| 1.0.0.RC1\t| ([issues](https://foo.bar.com))") + "| Spring Cloud Sleuth | 1.0.0.RC1 | ([issues](https://foo.bar.com))") .contains("spring-milestones") .contains("url 'https://repo.spring.io/milestone'") .contains("Dalston.RC1").contains( @@ -303,7 +303,7 @@ public class TemplateGeneratorTests { @Test public void should_generate_release_notes_template_when_url_exists() throws IOException { - ProjectGitHandler handler = new ProjectGitHandler(this.props) { + ProjectGitHubHandler handler = new ProjectGitHubHandler(this.props) { @Override public String milestoneUrl(ProjectVersion releaseVersion) { return "https://foo.bar.com?closed=1"; diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/versions/VersionsFetcherTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/versions/VersionsFromBomFetcherTests.java similarity index 76% rename from spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/versions/VersionsFetcherTests.java rename to spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/versions/VersionsFromBomFetcherTests.java index 70bdb489..beda2144 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/versions/VersionsFetcherTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/versions/VersionsFromBomFetcherTests.java @@ -21,19 +21,22 @@ import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.nio.file.Files; +import java.util.ArrayList; +import java.util.Collections; import org.assertj.core.api.BDDAssertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.cloud.release.internal.ReleaserProperties; -import org.springframework.cloud.release.internal.pom.ProjectPomUpdater; -import org.springframework.cloud.release.internal.pom.ProjectVersion; -import org.springframework.cloud.release.internal.pom.Projects; -import org.springframework.cloud.release.internal.pom.TestUtils; +import org.springframework.cloud.release.internal.buildsystem.MavenBomParserAccessor; +import org.springframework.cloud.release.internal.buildsystem.ProjectPomUpdater; +import org.springframework.cloud.release.internal.buildsystem.TestUtils; +import org.springframework.cloud.release.internal.project.ProjectVersion; +import org.springframework.cloud.release.internal.project.Projects; import org.springframework.util.FileSystemUtils; -class VersionsFetcherTests { +class VersionsFromBomFetcherTests { File temporaryFolder; @@ -52,13 +55,14 @@ class VersionsFetcherTests { throws URISyntaxException { ProjectVersion projectVersion = new ProjectVersion("spring-cloud-contract", "2.5.0.RELEASE"); - URI initilizrUri = VersionsFetcherTests.class.getResource("/raw/initializr.yml") - .toURI(); + URI initilizrUri = VersionsFromBomFetcherTests.class + .getResource("/raw/initializr.yml").toURI(); ReleaserProperties properties = new ReleaserProperties(); properties.getVersions().setAllVersionsFileUrl(initilizrUri.toString()); properties.getGit().setReleaseTrainBomUrl( file("/projects/spring-cloud-release/").toURI().toString() + "/"); - ProjectPomUpdater updater = new ProjectPomUpdater(properties); + ProjectPomUpdater updater = new ProjectPomUpdater(properties, Collections + .singletonList(MavenBomParserAccessor.cloudMavenBomParser(properties))); VersionsFetcher versionsFetcher = new VersionsFetcher(properties, updater); boolean latestGa = versionsFetcher.isLatestGa(projectVersion); @@ -71,13 +75,14 @@ class VersionsFetcherTests { throws URISyntaxException { ProjectVersion projectVersion = new ProjectVersion("spring-cloud-contract", "1.0.0.RELEASE"); - URI initilizrUri = VersionsFetcherTests.class.getResource("/raw/initializr.yml") - .toURI(); + URI initilizrUri = VersionsFromBomFetcherTests.class + .getResource("/raw/initializr.yml").toURI(); ReleaserProperties properties = new ReleaserProperties(); properties.getVersions().setAllVersionsFileUrl(initilizrUri.toString()); properties.getGit().setReleaseTrainBomUrl( file("/projects/spring-cloud-release/").toURI().toString() + "/"); - ProjectPomUpdater updater = new ProjectPomUpdater(properties); + ProjectPomUpdater updater = new ProjectPomUpdater(properties, Collections + .singletonList(MavenBomParserAccessor.cloudMavenBomParser(properties))); VersionsFetcher versionsFetcher = new VersionsFetcher(properties, updater); boolean latestGa = versionsFetcher.isLatestGa(projectVersion); @@ -90,13 +95,13 @@ class VersionsFetcherTests { throws URISyntaxException { ProjectVersion projectVersion = new ProjectVersion("spring-cloud-non-existant", "1.0.0.RELEASE"); - URI initilizrUri = VersionsFetcherTests.class.getResource("/raw/initializr.yml") - .toURI(); + URI initilizrUri = VersionsFromBomFetcherTests.class + .getResource("/raw/initializr.yml").toURI(); ReleaserProperties properties = new ReleaserProperties(); properties.getVersions().setAllVersionsFileUrl(initilizrUri.toString()); properties.getGit().setReleaseTrainBomUrl( file("/projects/spring-cloud-release/").toURI().toString()); - ProjectPomUpdater updater = new ProjectPomUpdater(properties); + ProjectPomUpdater updater = new ProjectPomUpdater(properties, new ArrayList<>()); VersionsFetcher versionsFetcher = new VersionsFetcher(properties, updater); boolean latestGa = versionsFetcher.isLatestGa(projectVersion); @@ -109,7 +114,7 @@ class VersionsFetcherTests { ProjectVersion projectVersion = new ProjectVersion("spring-cloud-contract", "1.0.0.BUILD-SNAPSHOT"); ReleaserProperties properties = new ReleaserProperties(); - ProjectPomUpdater updater = new ProjectPomUpdater(properties); + ProjectPomUpdater updater = new ProjectPomUpdater(properties, new ArrayList<>()); VersionsFetcher versionsFetcher = new VersionsFetcher(properties, updater); boolean latestGa = versionsFetcher.isLatestGa(projectVersion); @@ -123,7 +128,7 @@ class VersionsFetcherTests { "1.0.0.BUILD-SNAPSHOT"); ReleaserProperties properties = new ReleaserProperties(); VersionsFetcher versionsFetcher = new VersionsFetcher(properties, - new ProjectPomUpdater(properties) { + new ProjectPomUpdater(properties, new ArrayList<>()) { @Override public Projects retrieveVersionsFromReleaseTrainBom(String branch, boolean updateFixedVersions) { @@ -137,7 +142,8 @@ class VersionsFetcherTests { } private File localFile(String relativePath) throws URISyntaxException { - return new File(VersionsFetcherTests.class.getResource(relativePath).toURI()); + return new File( + VersionsFromBomFetcherTests.class.getResource(relativePath).toURI()); } private File file(String relativePath) { diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/bootstrap/src/test/java/demo/BootstrapClientApplicationTests.java b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/bootstrap/src/test/java/demo/BootstrapClientApplicationTests.java index 2b2235bc..c297cbd6 100644 --- a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/bootstrap/src/test/java/demo/BootstrapClientApplicationTests.java +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/bootstrap/src/test/java/demo/BootstrapClientApplicationTests.java @@ -38,7 +38,8 @@ public class BootstrapClientApplicationTests { public void contextLoads() throws Exception { assertThat(2).isEqualTo(this.server.getTomcat().getMaxThreads()); // The application.yml is never read because spring.config.name=sample - assertThat("application").isEqualTo(this.server.getServlet().getApplicationDisplayName()); + assertThat("application") + .isEqualTo(this.server.getServlet().getApplicationDisplayName()); } } diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/config-client-decrypt/src/test/java/demo/BootstrapDecryptionClientApplicationTests.java b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/config-client-decrypt/src/test/java/demo/BootstrapDecryptionClientApplicationTests.java index c716cb03..c4c04465 100644 --- a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/config-client-decrypt/src/test/java/demo/BootstrapDecryptionClientApplicationTests.java +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/config-client-decrypt/src/test/java/demo/BootstrapDecryptionClientApplicationTests.java @@ -26,8 +26,6 @@ import org.springframework.cloud.config.client.ConfigServicePropertySourceLocato import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; -import static org.junit.Assert.assertNotNull; - @RunWith(SpringRunner.class) @SpringBootTest @DirtiesContext @@ -41,7 +39,8 @@ public class BootstrapDecryptionClientApplicationTests { @Test public void contextLoads() throws Exception { - assertThat(new String[] { "http://localhost:8888" }).isEqualTo(this.config.getUri()); + assertThat(new String[] { "http://localhost:8888" }) + .isEqualTo(this.config.getUri()); // The application.yml is never read because spring.config.name=sample assertThat(this.locator).isNotNull(); } diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/config-retry/src/test/java/demo/StandaloneClientApplicationTests.java b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/config-retry/src/test/java/demo/StandaloneClientApplicationTests.java index 140c6cba..01726a9c 100644 --- a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/config-retry/src/test/java/demo/StandaloneClientApplicationTests.java +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/config-retry/src/test/java/demo/StandaloneClientApplicationTests.java @@ -52,6 +52,7 @@ import static org.junit.Assert.fail; public class StandaloneClientApplicationTests { private static ConfigurableApplicationContext context; + @Autowired private ConfigServicePropertySourceLocator locator; diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/COMMIT_EDITMSG b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/COMMIT_EDITMSG new file mode 100644 index 00000000..e6b794df --- /dev/null +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/COMMIT_EDITMSG @@ -0,0 +1 @@ +Added script diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/hooks/commit-msg.sample b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/hooks/commit-msg.sample index b58d1184..bc8d07cb 100755 --- a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/hooks/commit-msg.sample +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/hooks/commit-msg.sample @@ -18,7 +18,7 @@ # This example catches duplicate Signed-off-by lines. test "" = "$(grep '^Signed-off-by: ' "$1" | - sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { - echo >&2 Duplicate Signed-off-by lines. - exit 1 + sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { + echo >&2 Duplicate Signed-off-by lines. + exit 1 } diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/hooks/pre-commit.sample b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/hooks/pre-commit.sample index 68d62d54..6c55be87 100755 --- a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/hooks/pre-commit.sample +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/hooks/pre-commit.sample @@ -7,12 +7,11 @@ # # To enable this hook, rename this file to "pre-commit". -if git rev-parse --verify HEAD >/dev/null 2>&1 -then - against=HEAD +if git rev-parse --verify HEAD >/dev/null 2>&1; then + against=HEAD else - # Initial commit: diff against an empty tree object - against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 + # Initial commit: diff against an empty tree object + against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 fi # If you want to allow non-ASCII filenames set this variable to true. @@ -25,13 +24,12 @@ exec 1>&2 # them from being added to the repository. We exploit the fact that the # printable range starts at the space character and ends with tilde. if [ "$allownonascii" != "true" ] && - # Note that the use of brackets around a tr range is ok here, (it's - # even required, for portability to Solaris 10's /usr/bin/tr), since - # the square bracket bytes happen to fall in the designated range. - test $(git diff --cached --name-only --diff-filter=A -z $against | - LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 -then - cat <<\EOF + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0; then + cat <<\EOF Error: Attempt to add a non-ASCII file name. This can cause problems if you want to work with people on other platforms. @@ -42,7 +40,7 @@ If you know what you are doing you can disable this check using: git config hooks.allownonascii true EOF - exit 1 + exit 1 fi # If there are whitespace errors, print the offending file names and fail. diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/hooks/pre-push.sample b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/hooks/pre-push.sample index 6187dbf4..29d0a57a 100755 --- a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/hooks/pre-push.sample +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/hooks/pre-push.sample @@ -24,30 +24,26 @@ url="$2" z40=0000000000000000000000000000000000000000 -while read local_ref local_sha remote_ref remote_sha -do - if [ "$local_sha" = $z40 ] - then - # Handle delete - : - else - if [ "$remote_sha" = $z40 ] - then - # New branch, examine all commits - range="$local_sha" - else - # Update to existing branch, examine new commits - range="$remote_sha..$local_sha" - fi +while read local_ref local_sha remote_ref remote_sha; do + if [ "$local_sha" = $z40 ]; then + # Handle delete + : + else + if [ "$remote_sha" = $z40 ]; then + # New branch, examine all commits + range="$local_sha" + else + # Update to existing branch, examine new commits + range="$remote_sha..$local_sha" + fi - # Check for WIP commit - commit=`git rev-list -n 1 --grep '^WIP' "$range"` - if [ -n "$commit" ] - then - echo >&2 "Found WIP commit in $local_ref, not pushing" - exit 1 - fi - fi + # Check for WIP commit + commit=$(git rev-list -n 1 --grep '^WIP' "$range") + if [ -n "$commit" ]; then + echo >&2 "Found WIP commit in $local_ref, not pushing" + exit 1 + fi + fi done exit 0 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/hooks/pre-rebase.sample b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/hooks/pre-rebase.sample index 6cbef5c3..e2532c61 100755 --- a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/hooks/pre-rebase.sample +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/hooks/pre-rebase.sample @@ -17,20 +17,19 @@ publish=next basebranch="$1" -if test "$#" = 2 -then - topic="refs/heads/$2" +if test "$#" = 2; then + topic="refs/heads/$2" else - topic=`git symbolic-ref HEAD` || - exit 0 ;# we do not interrupt rebasing detached HEAD + topic=$(git symbolic-ref HEAD) || + exit 0 # we do not interrupt rebasing detached HEAD fi case "$topic" in -refs/heads/??/*) - ;; +refs/heads/??/*) ;; + *) - exit 0 ;# we do not interrupt others. - ;; + exit 0 # we do not interrupt others. + ;; esac # Now we are dealing with a topic branch being rebased @@ -38,34 +37,31 @@ esac # Does the topic really exist? git show-ref -q "$topic" || { - echo >&2 "No such branch $topic" - exit 1 + echo >&2 "No such branch $topic" + exit 1 } # Is topic fully merged to master? -not_in_master=`git rev-list --pretty=oneline ^master "$topic"` -if test -z "$not_in_master" -then - echo >&2 "$topic is fully merged to master; better remove it." - exit 1 ;# we could allow it, but there is no point. +not_in_master=$(git rev-list --pretty=oneline ^master "$topic") +if test -z "$not_in_master"; then + echo >&2 "$topic is fully merged to master; better remove it." + exit 1 # we could allow it, but there is no point. fi # Is topic ever merged to next? If so you should not be rebasing it. -only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` -only_next_2=`git rev-list ^master ${publish} | sort` -if test "$only_next_1" = "$only_next_2" -then - not_in_topic=`git rev-list "^$topic" master` - if test -z "$not_in_topic" - then - echo >&2 "$topic is already up to date with master" - exit 1 ;# we could allow it, but there is no point. - else - exit 0 - fi +only_next_1=$(git rev-list ^master "^$topic" ${publish} | sort) +only_next_2=$(git rev-list ^master ${publish} | sort) +if test "$only_next_1" = "$only_next_2"; then + not_in_topic=$(git rev-list "^$topic" master) + if test -z "$not_in_topic"; then + echo >&2 "$topic is already up to date with master" + exit 1 # we could allow it, but there is no point. + else + exit 0 + fi else - not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` - /usr/bin/perl -e ' + not_in_next=$(git rev-list --pretty=oneline ^${publish} "$topic") + /usr/bin/perl -e ' my $topic = $ARGV[0]; my $msg = "* $topic has commits already merged to public branch:\n"; my (%not_in_next) = map { @@ -85,7 +81,7 @@ else } } ' "$topic" "$not_in_next" "$not_in_master" - exit 1 + exit 1 fi <<\DOC_END diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/hooks/pre-receive.sample b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/hooks/pre-receive.sample index a1fd29ec..66107d96 100755 --- a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/hooks/pre-receive.sample +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/hooks/pre-receive.sample @@ -6,19 +6,18 @@ # # To enable this hook, rename this file to "pre-receive". -if test -n "$GIT_PUSH_OPTION_COUNT" -then - i=0 - while test "$i" -lt "$GIT_PUSH_OPTION_COUNT" - do - eval "value=\$GIT_PUSH_OPTION_$i" - case "$value" in - echoback=*) - echo "echo from the pre-receive-hook: ${value#*=}" >&2 - ;; - reject) - exit 1 - esac - i=$((i + 1)) - done +if test -n "$GIT_PUSH_OPTION_COUNT"; then + i=0 + while test "$i" -lt "$GIT_PUSH_OPTION_COUNT"; do + eval "value=\$GIT_PUSH_OPTION_$i" + case "$value" in + echoback=*) + echo "echo from the pre-receive-hook: ${value#*=}" >&2 + ;; + reject) + exit 1 + ;; + esac + i=$((i + 1)) + done fi diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/hooks/update.sample b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/hooks/update.sample index 80ba9413..68a5e634 100755 --- a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/hooks/update.sample +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/hooks/update.sample @@ -31,15 +31,15 @@ newrev="$3" # --- Safety check if [ -z "$GIT_DIR" ]; then - echo "Don't run this script from the command line." >&2 - echo " (if you want, you could supply GIT_DIR then run" >&2 - echo " $0 )" >&2 - exit 1 + echo "Don't run this script from the command line." >&2 + echo " (if you want, you could supply GIT_DIR then run" >&2 + echo " $0 )" >&2 + exit 1 fi if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then - echo "usage: $0 " >&2 - exit 1 + echo "usage: $0 " >&2 + exit 1 fi # --- Config @@ -53,75 +53,74 @@ allowmodifytag=$(git config --bool hooks.allowmodifytag) projectdesc=$(sed -e '1q' "$GIT_DIR/description") case "$projectdesc" in "Unnamed repository"* | "") - echo "*** Project description file hasn't been set" >&2 - exit 1 - ;; + echo "*** Project description file hasn't been set" >&2 + exit 1 + ;; esac # --- Check types # if $newrev is 0000...0000, it's a commit to delete a ref. zero="0000000000000000000000000000000000000000" if [ "$newrev" = "$zero" ]; then - newrev_type=delete + newrev_type=delete else - newrev_type=$(git cat-file -t $newrev) + newrev_type=$(git cat-file -t $newrev) fi case "$refname","$newrev_type" in - refs/tags/*,commit) - # un-annotated tag - short_refname=${refname##refs/tags/} - if [ "$allowunannotated" != "true" ]; then - echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 - echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 - exit 1 - fi - ;; - refs/tags/*,delete) - # delete tag - if [ "$allowdeletetag" != "true" ]; then - echo "*** Deleting a tag is not allowed in this repository" >&2 - exit 1 - fi - ;; - refs/tags/*,tag) - # annotated tag - if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 - then - echo "*** Tag '$refname' already exists." >&2 - echo "*** Modifying a tag is not allowed in this repository." >&2 - exit 1 - fi - ;; - refs/heads/*,commit) - # branch - if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then - echo "*** Creating a branch is not allowed in this repository" >&2 - exit 1 - fi - ;; - refs/heads/*,delete) - # delete branch - if [ "$allowdeletebranch" != "true" ]; then - echo "*** Deleting a branch is not allowed in this repository" >&2 - exit 1 - fi - ;; - refs/remotes/*,commit) - # tracking branch - ;; - refs/remotes/*,delete) - # delete tracking branch - if [ "$allowdeletebranch" != "true" ]; then - echo "*** Deleting a tracking branch is not allowed in this repository" >&2 - exit 1 - fi - ;; - *) - # Anything else (is there anything else?) - echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 - exit 1 - ;; +refs/tags/*,commit) + # un-annotated tag + short_refname=${refname##refs/tags/} + if [ "$allowunannotated" != "true" ]; then + echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 + echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 + exit 1 + fi + ;; +refs/tags/*,delete) + # delete tag + if [ "$allowdeletetag" != "true" ]; then + echo "*** Deleting a tag is not allowed in this repository" >&2 + exit 1 + fi + ;; +refs/tags/*,tag) + # annotated tag + if [ "$allowmodifytag" != "true" ] && git rev-parse $refname >/dev/null 2>&1; then + echo "*** Tag '$refname' already exists." >&2 + echo "*** Modifying a tag is not allowed in this repository." >&2 + exit 1 + fi + ;; +refs/heads/*,commit) + # branch + if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then + echo "*** Creating a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; +refs/heads/*,delete) + # delete branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; +refs/remotes/*,commit) + # tracking branch + ;; +refs/remotes/*,delete) + # delete tracking branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a tracking branch is not allowed in this repository" >&2 + exit 1 + fi + ;; +*) + # Anything else (is there anything else?) + echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 + exit 1 + ;; esac # --- Finished diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/index b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/index index 833712790dc6a410986c178009db6360cd9db464..a2ef8e34ec2b494f7488394f9ca5723f5fcb9acd 100644 GIT binary patch literal 33343 zcmb__2RN1g8~5WlMmCw5k-aHYWUq`eQ;E!MvJ;}RqLhphQW+(potCW75Xvs3K?x}$ zquw)~=Q-y&&hhL2zHisnbzi?7&IPE-TYjh6JSu-=N;<3 zFCZ}31MiKZzg7}|&MYxkCx3NjNvrWIQ8oIWj5v7Y-UPs^;2$2K=o9X*fDe;$d~Ha7 zwNB1&I#Jr3Zny7m4EmsH#3XdXKlC^tg!2~>>=G2@5v=I%67CTo5B`^ek4x|h`L`qe z1OA@st^HD8Cf4lB&uzbC|J`2Y6Mr`#zJmXt;6My$sJBN5jvB|zvpGUtK4p*vc}_y& z(A}YScS@TmaB6%1FhnSP$mBJ5l3O~!tPtW68tNUeFGL{{ES#ffwmo%?!7$Dq)-=NV zqdtiAhmv{!^S#3->z$0M-jmd7i8n32XoTnjj0&N_F5%uG1Q}4$!5gGMs<(p!8n^$t z9;c)0KZ?3DwkPrPvo&16Dr-Ys0}De1e|G@N53=~UXa$jenA}h2*LhrixNhoJd9pBD zS-A*z$C33pL+_wWx?)PunE{k%N_LUn_J{Jh;e-g z?q#`&R>Ik^h0`D&4+-8=!wMSvHHJ#ta{YZ{eLu#2TAY_q17udjga44I?3C(0NP?$Q z!FBci2H~Csmlxj;qc=t!{U|k421vp#6=8k}`GvUn2l;t`U{L)ai_eQ%6^TPDD=WI; z;mB~}?Xo`R2fjD7iszoIh5@=roKTOD(0{653(SypOE-~{TiFDA)&xL z;lxs}4r;ZBCa){s+yJ;;!$K6@1KoT*g5});{euESptLCHo!TGimvL~aZk$dtLO(~6 z`wmZwS?nc4<-~D-5$hLHI$m!OKad6E)I|EDZnlX#rTD;erl$Lo_Jm!bTTGcyOBSGx z^#@mipmdv1mjHJczrX+wic*Jofh>qSj>H9a7=+)hYive2iXXo@!cY)P)sR-907xKk z2?`*ia40Xxf;jF-9GZ={VsA%lD=pL*#Ot_GZ5kHU0*d!pi_ZNCK162D-hj&+^;e%5$k!$0Ht zdK?G|#cY2Re0*12=RJ|Qv|dfz&#B`N3)q^_)Lcwu7!*$m&JPB5P{t)u{J+#6A$>@X zkOg&#*m<=cyRVUH{9-*|qeW%~h2 z6!8CNJySD~;4xkrxhqL~*-CiNkn|3v-RZg44oW2h;Iqd*j zqcAUxmgh&JqZRl?$OpI139k;9#KwWOU>r8cIGE2U2kzmqYc_Sb9_uOgcJ$K1uL##D zfD?=(*dsLf075<#{GyzYe(7oF*9p6dw{+F1(TjZ6b~U&x;x}Gl}~Gt*FZ`mr+Y|qOIvk!P>REXD1xm3IqY274UIe%oXSb z_n6Rpf-H!?28j>sJnPD&6%ae0m-t)Phuf;{v($W6J+P5HK0!_vhPJx$rj|yEAwj{I z{gkVyGk0q4&{E76-?058qwy{xmBx(p%Stc!3;OzMO@;yKZ?-%0{!Ago)l(-|ad%ytM^K(%{JLh0_y+80|6H<0$5`R53(SxA`+LvehJ*C{Y$>2 z8z!jUkOk{rjKoFLPny|X+4WY}s4w!(=9pW18Rs)&Edi?)@+EXEu7il{ZWtEq;p;+F zbfO-D;(#m|4<9lf=EaRari9vO521Eu$J%^*ltawLKg3z zmZU$?&dmotaXLlXUeykDH!Iq{_rl)`p$mX1IsdSz$cubgvPAo)<#U4MoJn> zf}wl=WO<6Y^PPjXVahF=pnW-5Z!k|d4uZ&*F9Q_vr~Z!Qmv&x)isezFKycheA<4zr z{qC+7yW95wmXz}UzbrQ8dXTJxO!F-Tip`6teD1(&zw-2_Y@?j{Lcc=$8axlkLPLE7 zS+Jjska+^Y=ltPwH`=@O%~GYWMeORS`VGN zFfu!9_n(r_g^qc1ad&ritFS`n9HRVI5G)bD|2daXqDXwE!+o3Y``l1Cliae}H1GJ_Zl5bx04=0n zGQz=6pB1hqp!z`;tm953KBe;;1$;swmrWoD2eKgEE)qNn=ePgFBVAT0%sX0=eFV*# zm}=(T$2r5x?}`la?#jrxsw$+mAJAKlMxg<}f}&~II2EJZXLGqGfD??v(>oY*^GYlq3VzXzNIuc1xa5iY@ijWnQn!w^BoFGg z%$(Vh0&GV3r6?aGEG$u55RDy5b7vnCpNd|1aC z$Y)tODddadLgLZUnM{Xms8!OUj<>mXG-1udXM0^;Hv&4#@W_^vG+*LsLiK|z*srgV z_)Po-S3iD3&D?YnUeDWdElTrv-S4!ua2*2zBRpLHrH<57NWZiNd(_?`7GCYzx8hCiRg!zT8kT!8m zDfcIuBjEnviIZcs_1wc7oc;*5=- zRUe=Z=0~)El03^ZB;C?OGXk3Pkj3LtA4cK=fwGo6hZtUrW^CMZ)#F;Q{By6;HXA^R z0`3aJg7Skb$ln$u9=&+)NA}VmC)VH1Fj{4-t%iQ%=wxpN&wHXgNrZ*Z(*}2tCYp$( zYN9mn(b>p2n4jEwQP9HuGQ6btaNr0({ip<5p)(U$>*;}csxR;1vJZ1y_YMfbJU$Bb z#@(F3Lj%eWvLLT@NdMFW^lA=O!y?56N*o(_Ml9CKNqO}-1KO1RlNla{k+=tm_)P>< zR|prfpq{*u_-L>G?6Cc^4RNJoHTkHa$NUTFnY5#T?f-;tgeAie%Y`X16-4wyL17vh z(ivnyUQQz8qOkAR|A)B9Ymek@1B&%0xmQIq-&=cAz}_iQ*yiF*3#vb2y{N~EKETeE z;~>%GfAd2mPpDpy1^eRzk{>3tw>z^)p2NuW#nlCIZetILTtJaLKKWAP@8qC7Aq(bPgT$k!GK@2=+dqC@!?fq;9oOJA zRiM)M9H6rdkEEpJ^Cc=Hh4mAC8i`N4+rP1qb$9;Pz+r!be) zDd3YAC}I{t`9c=VI|hkMTVAUs#nGQ1U&C^x6K$DtG%LzFumD)U9G66>y6#?qZdi5L zgn5Tzp2EWK?Lc^t#p9xmBXQ|X*N-&?-OTZ~@aElowyQwXlYKQ~3ZVO+xa9dJk|~4> zSuk&sdt8PwAr98Sx01Ib%a*im(g4>B9~bt10=E4x_&dBqz3>|Xb8o~ki6|P1{c;P* z2Ve(G<(F+$6O$IEd%$9@?!K1qHBB?Xii_tT`h=R~-j*q#{d%|{`ww2TDVGh2k%ej} z4tk$p0hsar{<}X=%Ef*O~C!X?*}C$9)*68!}Esi|NqB65JuwB=ETuQ_ip-zEka{|oNF z>z;0nI0v@ASPRzo3o?IT^LwK|CULF4)<=842o_EY-h8)aeJH>Ut`PDr{`-Rv^2hD- z$oTzA;+OpUWWor)WM3?Uc!Mm+UkcJcbIuEqxCGm6lJ5SW9?ytWRofVWg~t2^{YG~hs+nM>ivK^!Y`R+$OONl60O`&t3i1{7M~BT zDiRmXI9&bhepp9YtBFU@n@E$!%UupyT!6xV;aVKPPC#!r!U}+Wf0EO;V-RN*p6TK7 z=t<6-z<}l!+dv(M{rk$_F9x&ldr8YSHSYt|$m9J(dsE_<6`3bvILC$Wf>JZ{)m-i} zN%ziZcm{3^S_5b8Ac&4LiwawN$>n-xtp=_|f z>-7VnvWN}x06U0JBz34>kj48$lf3W36h!~$$)bZ(c=)LOeVP1#p?8zEM;QTD$R9z1 zkRQl`{xGo<@7rkKKJpKz`Y0H#Dpj&@a*17MPfzSa8$bo}_diJwN%8~AjBm-`8`<=@ zK{2UPFRFB5n)B_#5}>>c=RYL}p8*kOk{Vhrt~ud>%n? zq)pOE?uF;l;>(RaPg>mKT%Z|OSGG1z1uFaP0t9N-D?2=(;y zj+77a#=O(%5)9vR;P*|-=RBGbnJ2)XTK+_@Qquj`b~C1Dr@y)jzI=2A^S&sl-{7zS zdHm&$LWtK&y2N}ofw&*2zidt_H@zNhWh}z^DZXjg$JZx(RUoj5)IXWNu)(K9W+bnG zkLEz)Q;nr0x9rdBF+CIhz43334rYn9!BM}Sj*iiwFv5V zFA^8vbk&;f+iLW}=RQBj{b}keUDxKSivWdx!1eNQ@eB1*@CgaT%zR4vKw_jyEDy(>fneB)KRj z?3XPALy;$MX#IxvPml%sT?B~-=-F*HxYVe+e&3eZpom0?dRl|+Rn~wM3Em3ofbxMX zh;s>vg9aE*g&odjxDjb6QL9paXYcDVW&tN)JpqTLI?M7x6o;ZdP`i=1^cN588TgEL z^z-#Rd(0&T9ru9s=;vF27CBs81P0zAZh@GWo(}w101&T`1@o3d;seGmdhWa)PaU@! z%8dOK>wS8BUR&rlz!T^a7V4!UAMEYw8W=#ddQ;LpDh=tE@pqnCci+U9@;k1o^^Pw9 zszB>hYD0hv>6fsIQ}RpAg7iy!m_47P&hHLGw?ORL=JGw42V|a!djVQVzhtJCH7=7C zE;O)nLu5^4FV+gb3(~^#h4Mw>18HLI*X1J)9{bA~a{JowOiI+b-SI~Obqe_8b@?y% z8A3>0hCOmrDHE%%P&W~kMz zXPQOg^5L6hMumm>A=E;tuCyfQaK@iZiu88JHHWtP(%!KjHnF2S8|Y^V ztOoPL`6X5hCBLY%$avA}gO4s{g|%tesz|2?kG-w>`Sp(P0-#FlmyB9=Ve+7`z+v^l z>LWypv+`WtpiV52xK!-2N^5i-_&%;3+Lw3HAoWdnc^tPruz@V@Kd6Laz9jXb{T>%8 z<@hK#t)={`%h3Y+_MU5ggI53zQd|<1kmO6O4rp#d7N0K-$$pBpBhp#9)Ajx6W0@=} z{S)gFQpEk1Yydh!&2ayIdwdaO@qTD!k-RbAGyTZVBIhCz%O~{gQ+n&sor0xr_y9rt zAi{h=2KN{ge0`T_S4C03#z_AZ))PhY{>c}H=)QbeK4_B9)zMj*>~7(Rx0B_G6x(ha zabVBkrPY_(0e$j#WRz%e0DSZdHZtyQQ)mr^_aV#TKv^O4W>_n7Q~YgH@s%-qwneU_ znrAJ_+EcZF`9H^jhX-TP$3;QDL7@6V7GGyH$$Mk8Q~V-@Tk3odiwR}56<8DxhpEs} zy#uT$$3vpnmE$22Fcb%5!G3*;6P(x;lIDwoWSnnn=H7>Q4TF2~pvpbse%G&!q1i zeOYaxi+RA$=xiB~UAo3Hd}E$q{W(C10{#kuhw_9hh)4RKY1?_`=A6KnVo`2I#??>u z{;Ko3x~d7#T8>AkrwjH4cnZ&<2?;~EkOlEk$U4%sZ?0_cG?F>b;K0w2bXUT~y+%yF z&cyn~?nesu72@_KZqC$rd{i?MABcSU%g400GHv6{o{OVgr!98;Wo*m z0%A*o9V@u=)S7}DO;}v41#wBvalnup$Cllty?46VH4kmF-aDsS#Bx&qA8$Zx2kqME3xIdUdgR^!<8tU~TY#qVqc);ky-buK_0Pc^Ip#5a>8e;a(MueV>cS zANBk*DV4PnT?L&Nv&7CvcaKkeRaTM&R)@F+dk2MvC}RBLYXY9KDXurz_XUXj0_&qA z`47j3G+zbwq#t5cO|awZVX_0*Li{{18*JjO5~MH4f_Wz*>&&vQh-b9KHSpbAX;Z^j zB}`iF^lVL201N1ku-xMBFP5zf)TT&(^o%K&4 zm~4Yx+{pC_R4>Sa@$X0C0dB87b8V!41vSe5a+)jY>y2gFAy@}Ulj0EsikS|G54A)5 zKo-;`Rv(yWwb1ug(44O4EFXRJEv#X!ug=aWYL!DzLs$*~>xpm(0|?iMqiTsk$ zf(g3nmlhbj$vv@`mkSB*rSre4= zq&|nlTNOWJGMIOCFW<(i8JBv#_3f7EVP5zFXp-QOXoFmyr25$7&hm&Z@pUG~RslWv z8eqPwG5EyufWz95)_cTbQyg=6K*7!Jg)!5=Tq*%NEFgYlL3}|L^pk+hgM!Y4L&Jhy zy#qY(&zHz54eA@n;{DUABmJ||zAEs4VrzZe)1oh>=$m^?FB`+XL4XtCAE7kJA7t@< zQ6WgbXs@iDV+~`p3q2Kbhoyz0E#8mS>vI5F2)|^MW{b}YUkEa4!>?BgvY}Jh^-6xi z&mP3bT#6$4GkBYmZCn3R#l^upF((pJZ=JA_e!mV-BacsBamck2$``VDTxybggH<}{ zE0tS3zrAr?Ygf2?L1fA-QMceDptlT{M0u3*CRHCk|JApu>9P5*j;Qhj^XDbWpZq>S znS30C{FiSNusD))S*vjNL7G2^mqmi7RR2aGv0Z55?o#Jvju_7U(-lTL8-V}BTfRMj z_=PNpmyE5 zW5u=Q+S_myp2c5Tik0e;fC}V~vQ){66f>xxzJ@Fw7fteB7w|lRJ<#@A^MjEdp7fv7 zT)%Hx|LU6rWR~F)N<_L);#Mt+>xv*UPc->`yE-u*L7Et-|J<=dyh0YAC+$WgE~BMm zuY{w6b&%0 zKJht~p@PHG9@Zntb1Ph)6ix;Z4rD?7Y(nDEywG)un7el{lx;ylRdKi9*sX(6H*W(J zc*So-@S~0>LqxOV=3D4)0i0F0J_O>De!hi#pUW-dm7t&HEsj$V7DsxhcM`H79tp32 zgG?nu_SX)-_b$$Ny^{8v)xB=|V;+!Q0WT0+$K?kAEDoR2A%4h$cqE^{0CvuIj)rcM zG?0rEJ%E-y7IiFbS9A!lQhv)v3NAmW4oU+G!;;;BKircJ7htAt1-C5`!)*axG3)+U(9!a5xwvU)d{kA zf3#Z2JXq|fKAdco=j@yjILmBO7bo~o^5srdAT3?Phs5CMI8ggf*oj=203>V-Om^v}W@bK_Vio9dB8hwtvH2RLVX`A&S=3<#3< zPb3FQ{-u!q(P2Ap2s|>B*{w+HS=w3hY=J7P{I)h=PToH`d0-O7U-QCG9G7ba+q#fW zAPef{6;dxKRA#H4c(&6Yj?XEmVpBn58BTu=Awc6l;-M@b3Ou0OkUUTcuzy&R_^5tY z2>oH-jkCTs^bR|_c>%S5#$EP-JxH&R#pg>+@_9Y<$4cwlj~Lq1Pd@u1M$0Q`bs^7IaZu%U<`daIqy7^UIqom%S1Nd<9U=B2q z2f&Xm!aHQhA7sHik0bq3&o_uSu2o}VIa$Q~RkWM`FkQ2A3N2u;+%E-(qikmHn}_jvY>A5khoNfk~Fjyb1!{w9_-3}5fG%hDBIb?0<0&8`)>t> z>Ihj7mt=jWzi=%5idgJ%3(csV?B2R2>_-ANHNM2Gr`Y+A>lboI1v~HMi9$G#1@%jE zFU4@%wf}Orq2-aLY^t;7A6PdX@N~cb2GFF4huhlh!bF1;4iPMoWN;OR<}zeK{2wGd zYZ-hES&Uo?s`If|c-_TfRAidS;|fTS!zb|U>5ch1&d^BAXKL~H5Bzp7^0D>g=f#X4 z-1iBi-H|we-M#hNSD8Bc3!@KeKB!vfJ!J9xbqgT7GESKH@^b=|4`e~S84TWk@7q|g zc!*`2LZ72LknyuP)Km`Y)-G(5H96#pLN{;Cdr`>J4lv>T5iiq}{MjP?(FczvE{;2& zv%96#l7|Xatt%D%z>o>Z;rvnPD57E$?bxxruNxHS#@UMkk$65(BmOzZ*`HAL5%F~N zDs?Su0hD1pGNX_vKO!+hb%rb+j|TI_YQ*<@ROEFmg2W@_M^G@9H_prb2XPkjo;Th< z^-rXK3i=hNrt$0Vn^g{H?Ks>B9XD!`}sbV@rNBJKhfVZt*ud z@5s%NgRLUw50x2)U)pl!gsQI}FMU&}wyK5hN2*^S4BVIUWh}nAdTBeiglMbzNR0H| ztJh#)x#y+~4zhKbt$SURy(f-rI=Ev8753Y(G07@3d{Y|d^t5AV-Zfyud-8UzL`R;D zCHTGDn0%EO)|8x~I%>^#$mDU%k*i!M?mAL60oalN>X?7L;rQeB-=A}1P8~S3dYFdo zDOdmIJ6IMsV2BDZ6q6iMNtM=hyn$lWx-)5GRP70~*d(hx==koYyR_I~=;+bLKMw{E zcf!fAs{XRPP@k7mg`V`G-c*~F&7iRdPNvWBZ||8=%MW%YuECcdMxUn==2J$pIAI-_ zm^z2f+oUNi{-X5RjCPpjdmM|{+6Ili%X|Co%|nTg1{0h*S-(@y-*^cFzsa`D`}`*#9CGbYO-1{=$c5OtKTH<>Z9FkCN`B%FbJ?-JL0;sZ>M<6*fm0$AIrpgOntn2 z;xBHk8x;=9I}mnA@cSQ&t>}PbCwq<0aXc(F|TQ-TA<|ansdK z&(06wPd}8uamJjQFM31z4YnfuMFozE=&(D@0qbo?n5?coXSaS;{h(Bk z8=^w;XYsMHkOdowwnK0DiVWEJGw!*=RH#q!Ht|}zp0T=@!5txE_^hFwGa8QQx0!@w z*ej!mR=*ug>aw?lj~19}!x5pHuY3w0Tu)bdIJq*t#!k7x;!Vr{K*i(rcerHt<%#;3mp=h%h+9Bi9N4*OFwd#`uqwID7eYzO3@6n-FGeo2L%@qN&%AoDJ*w3_3% zkg$V~KP|nmT+r*raN;mqh=F~!ovr<4Bo`I}NgrIVCM#0Ozd@fUyW(o-O1~MF#Rh$K z_fEe_gWG=JYhA962Yl6e)(dmtsj>fS_kcPl^X8-&uX*9^ihUPlVJ^bZOvS||=l8xKQ>;{9s4y#hCA_ zi*Qs~Iy=ThS!Zt-Zt$cN`6_jB$}Md@Au8-YS6*YplCXup_rRXOXG8XvX9eZ=?gHG9vV^TC1j?OZUGsPEdH zCef|t9}ZES-gtVkFwVk(8m7|uQQOd7ABM*lMT>pDzqzX@YOsqA4*FHSP^(4JmyA@a zfIqG(cP&efgv=6x#;$L)FM48ys^>0f@hz>-o0J~VJ@H-|)?Mnsa>t2N@!UJEFHBL# z*}iz}*T(?^?`;adx3e{PMrtu9GMy#V{kYo+3m7@s@7q5e;UJh|q(K@2}rVkxGZd zc5J&T^6E%dLT!!Ixx|WM>weV6n{e0@i_rqF*|wpB=#Mlh`bfBL`;fJPz!$d2qj|R{ z-pt(}c)t^2BK~ z>i*IZn{k>o)2m=$vzKzQTWs{K)iQ*=-5Q$Zx)Nk6lOf z#Qg1dAC-jUqf&LlY<sc z$-H!Tw)UAaD%WefU|`zu))1CV{byq#5~KOLFZeQkerdq&sqxnzxZPsu?jqrFg)>=J z-%wXl)+;%y_Y$VV_x5BVhqc4;qmAoA zte%&3NIv&Ug`+AlK6Ze)R4u)W`Ywu-R@uBp=|cq^l?Ico-1MVy(YEo&OOkAdJ_HYa zRzT9BeU;@wkc^Mt88!AbY%)A`tIc$-;OM~0a^2pk$Kx_|#uAqczZhv8N-KQo+KdCn z?vWaMEEz=D?kS&*&6iuU$;!;RRGNevOjwrh-3l#o$yR0)e|mYOWoGkT;=hy|(7-HwmFq-u+4?KEbd&CG-5@9xM{{N5 zIF=CX5|cY)8ayOcTw#wihcH;|O0bqRQ}|;eDl5^5v~k*Wv`W?agS{_ua7*7Q*?6aTHpT^`T^3K9|Uk zS$kzM6(%^Y4KnfxnM^Y^yt3-CcZ^)vZIXT`5gjiM>`GtL?2vNlbF-{bgQV5_jmis# z1h%oARpMd&>*AhOw$slOr8`6%GpSUZuM!3#>QCVvdB-Z=rsB`&%lbG+7szkl(P zsCemAeTn}-HGvT9q}tv%7xywDzb7Xlo!RZe?#R^U^9?W|)!$SYJiis%FRcgcUGhgW zzZ7-fg@MzqcO`x?OzyHcR~)F7uu-(jyR-!c_K&oXM-m18t%22@a)eZ>-joxO>d92>pU&pSIw9AG>ub-$8(ivKZ8h-HZT z<8u{<7VBHlfniVPZuSW94#9EBq`VpMv}qPtdv&dLUQQoPoq1mz9GAe{i_=qZ@K&m6LR?B4(V!N4<==wBbO6Dw+io9Z4`kCsR;GF z#+z_+b@xW9`A(PU#_PK32ayV?9I5!SDT)nE8xy_CRP-uimyh0an2>yFlNi$p=4#!Z z3tLbPk|@E+nl~^Z+s?7mtPw(~#Bx0|Z(C;>asKMVLogw-8y_*b?zj*YS=oEj`RI~? zbed=^c<95ukc!(gFr??rUp)5elUK4_;ce6I}RPZxN1*vsLB|%FCta+=TN6yQ`1bB!b;C z;kc~!JD*SKc{!^u)l+Amc|GXil*Sp>y&nHYpvU<`pJFk1naPbU}x?b8Nd3Gh3nV$$FX02EHC`aYtj4w ztdO1&U9Q<)@w19ii-Y~E&R^}kwFbYJ!Cu6A8QYt%P^GJNH|k2iZ>+IXKc%w$LeE{@9{g|99y9o8CesA&24_f7RX}T4hljJsdrepee&>9*QFbTL~$%>{Q-A zO^KSrKXf>^9loC#r27Dt=H<)hd>?&Y?Z)?Ws!ROx@6W%!l)Zp~rSJM&H(zs6R>tBh zXN5zHkVwxQ4*?k4R3AGV`J5{mUf;donqB?9VDI^?&wb#&zzz39vT$AX=v-bT4Sjx6 z1XtWbkpe?Fb8DA8BqEvQH13^hcJeuUcZWvbvw7H7`c@eh5zivcx+3+DacRFDryq{b zJ$Y(+%mNNQD0y9TbW4zsU~^@Ie=l>s+kOecb~xZ?=hBuaA=T*TRp0a+H-3ND7vO*l zU5VaFhk5o(YCyHg*3)#|H&*}2Nr6T5|My}XoV!GfJe1t1$P&_;dqwLNm#)>Trqqa+ zf)FDbKSWz=4-e+oZgxF1{MBlN?#U_|m=ReeqxkCY?*z8431p+)Xd1E4oBuS-$W`z9 zcF+ba8w*{`}*hM(*G8UYx1d#Gchi;uu+iw8-rMi$)P zd#(vx0T}`JGT61*Y%?c2*I)ZLJ?l@;jy_2Fld=6rD3%edf{TW|`shEk7vI`$QZVPZ z<`>F0itzBnKZ^N%=H`#(YnM#uu1oOr&b~@3g#(js6PR|g50aoA{`lC#eC%`m);)y2 z8u>xhW4kLRrZ7JwvAQK<&MJgWj=%_ZZBDkX?$Q}t_&^uGLuXi$aq_WeC*iDSe@J%2 zE~Dd9y{eIyH}BZG*y_&|00WBv&bL~spG7D9l^OfRo+*PCp7ezo8Bk$vdfbRQ9>nnN ziY|J_ev6dSI{Z=uUAkc(gcyglIBuL>9j?n-Bb~FBX0Jmj>KHU>?62~ht~>TzhyL)8 zwnVGxq0ism3Bi*l#k%RNw)^CvlD4filZI~w8jSDf!+}v-tA!R7ps$>&N~>?3QRJJ~ zl3joU%MF`96+d*taw54e_;|O?%bOXGa*>Rzc)6c6#)72S}Mwr$*oS=Czs55b5qKs!p+rc}gW;bC* zCa=*;mLF8#e^Tg)aJIhgQ8Crk*I-7Jm#+2P?Js*U#JR4eFtEwIsW7Q`eefL7olUOTpj-XmqUHvA zfNkJUVy=Zg3|wutc2L?VY^G$WFUpZYL5z33=W7`FgL{5tx0U56FZV`qhCSVy=ZCr? z5g!l49l3UB%??ouEfvspD3(@t-+n6g_EtES5$utxv-k1Ii(+p>Uh@qk*WXl9+s1Bx z5oSa+eCwPzdi*?a_RZ_9Wel#=3c{IiU@27D?*nS$d0cYPMce6Al8j25l;ObS13rkk zuG{icv{0emed+U}NAxNoBqKEyny2IZc*Vn_4n29Fx=DZJ`CTa-BiJ=^Zg)i^KV3ps zRNFvpQtbnM&yqR(^A>EQ?_q3+6r|~8)qH%Z@P^RQpu*o}^SJX8cCC@hzWY7?HfMy} zSd9#8e~DnTn;YR_495X4%~`cD?pIqKE^vOx+jDwH@c}|q*nj?9UT*2Jq(ryyJoQ$mCzWN)829H$;Go&M z1AzyRSNgiZquC*68*^4+SwnBoT)S>=TIU+R+mT_$GJekeAk}(8}><(&P zN%)<8av~f1mwSJ!Y>l3-BRm38diSK0dhm4hk=e_CdpgqNq?ykT!N7Gt2!nep?~*X+O?7K2W!lJq0- zlBppL#A?hstW|Hh$Moq-fjk_kIor&JCS^%D>0@5sz>5)1&d;p9XdBK7xTAveVDW ztd;aNjg~I>8`^tI?i(HQCs^TEFWix`qkvsNMJ;x1^}yMeyZ=m%)A(J)|HCOKAF;>e^gXW zH|s{=)hd=C01hu@?#|60ikTM#IyWBgk`>&kJQmrC|0r zr&=&C^ll8}d-Zf=YfDdUnx)ftj>`Ic1P0CxyAHG3vC}+jEMFgSoz@~8DbpO< zf9105JFJtk#BfGVyWZ+Zh7Dq~ClCHaR9qh!dpYhCJX8I{h~CUDq+^(N--7`(mKp32 z=r5ewV;opm_VQczF_8&TbzvZkl^yRlI%f~O{dzrM@ z;k@Un5*qf`M6-JRbke+VZ{}Q!xE$f^+Wl9_?)dJmC)&c#X_efy7j|4$W&c4OGuVZL8Ux`i(mRnOe@ zg-hon5P#+}yU?}ZUD@`zIofFlxi=ZWDfqnKwdn96nsxiw{yl*_PtC6u?IyaQ!E)E; zEn=P|;HKVb<^DIzW{r&RvGr3hcY)_xXZX$vEp%KMpA)-t{o~hYA2k^G=z!m|loTEL zrr_8eK`AGV1Go=;hJkY)QYj8cuV*W~)w<)76f5JX!0AhPQt-QC!q3UWQB(9a>KxVa z#v!@mJ{~D$1xzRRsSwZ$hYRpBLnz}=6s0CimBwjDQl0Ui0X~$GiGcYyj z_jpT;ZfrM>wcJuJR1#o!kIh2^22M(xYM(qxEqp!gwp-bSI_c(e!Eo@ZX8DgK!0im# zpL^8LE*R&>XeID_hi0aHtDcF0gyU*V)4#Ks#kU~C&WByO<({s>#gnjb3}<{tJ+~Yf zSc=>>fZnS!sM*wre^7{RDNd2v4XWo199D75YLsM5p3M{%%)$kUmBqAFm)HHVeI6<$ zC%13Wm^l88V}a;|iPb*Ey)yR1Zz`pF>F>Fj%hK839_6Ns3Ed6!mWSDS`mplEH|Hnv z8z+wGzA;ubF`U)TgV~u%J@R0$>@DTb_B~b3eup@#f?u4lO7J}Q*>QX>sD|}^<9*Yo J7iOlv{U06fZgKzs literal 33271 zcmb__cRZH;`~GFiDoOTUC7X=w8M0?q$dUWE%KiY%(BN{y=F5hE)bQV53jZ2~CXK@v|g1mt}0(LGwc5V)K zE`oNR9*!SQXXcPcI<8rkFjd0xNhj3iLcF-$ zyKR7j2mku-1YB)>Hu7hTi#UqFzYE6)+#MyFy7!Gu(mSQ6e7I%u!$f3=p&j7*3%-|+ zCyLb1#laVp2Gsd;Kn0wqxfsqvbkgmh{{EryJK_f@Zr(Vr7+d^wZfOW07w~oP^Ky zwdfIekKuSYpL=^GOID9xA|mRJ#x4DB6*JsGPYvuaP*qgXRuyo!2XPqhRHnjl8uQ>d zWXBme^!p2L2VZu@`}nh{S6%W=0dYJ)dEC>}&leS&m!OxYJD4jvPsaDU1_->Ta6BB- z_=tG#Ps1wrTI;AIMsE3c-1I%50mxwRe0}Ut25>>S%QnDP(B8q_Q&4GxOxexF!NX6{ z%gfEh&eqSx(*tFW0NXW3gZys}LzA%|#)@kKcFr0eoBV z`#AV|`uo^9_zI$22@%4^BV$$m5P}a;2cY6Nk7lhVuf6F`wtHnvx`dr98Z!X^?_c?# zzr-s0TD_i+3L*FqJ_1AvsPmp3Wa;>A`|d|1zEnu`;J&&001pHy2k6r9NE*dlCA4hqoUn)urxC4rC9zO?PzkjNu5$b>RT`MNY z-}_Y!!T%i2517y!w)HW4rm@7_b^eGa{zARwL2EIv_qe~WpuMNv2?rm3J5P5nPv4ES z*7WNt=|$i^gX5BZNz9tUEo`-j;}6bQP2T}HEswlB50Ij9H=K^;x1|q+2)x&DJe;G! zXRKqpA5B#MWKDZ=hyG38=ON|KfCL&3sszUAhJLml_O@=G9uC`D9n|M%RuF=>2F?qZ zssxl&zpBHvQS)k|Fpz;QVB#vy~O<9{B1rog%n`_hl?7 z=q}*b3^1)tOZ;|V!{E1fu=5G_@`F_nogb4+lPCgz2#$}Rouh6g=}w!J&d=-5|7WLM z{4<7>Ai!X2{4FY~w9&g%)?z?4t!+z-$@>@qa-4sK#|50`>x!P-3lzlrbNJqU#?KTw zE}$w2Nd8A$f2laA$5E>X2tE4Yym%>U7iL`tcx3sVLyvturdvy{)tXQQi2pM$)F3u` z8^~*rCXC?igYy#CkaS)y7&PkUrdeTNdZl1cZSTD^0yy~3yeAxjef?0&9|6}Bn0cN_ zLzfi6`vuO6w@N@iAtax(i&K&B??%saqzdtQX&|E2yg>w|ibjwK@EYJkT@ z>KxDU(n*2&;_pPp$seY_%o3}G^*#dBu(&q+T}+Syf!hYh#W6cZzh~b~hFDMfqdPrW z*|bS!O4Eb^ML6yjKL5+e#`JY2o;|4bF|41o!1;lFlf1{1wT{$}zl&gT$fX>onTbtw z1BABW|1UqY)R-aoJ|g%?Z;d?RA-t#0V%4|bRLCMOrSRmwbHMttcD;XKIyHuGYaj1@ z7lGhwhVyOHFV!~Zhw#x~^o7|6oadN=V`30-jKJd{PxQFgH*}tHhQ`TIwiT~Q@{5LK zN+z&pJq{lSKc8Tjeb#W_aUDb8F2QjLt{>KxRP6q0y+kH-JWu@CVbwYbKTSXeh6}e3 zq@v|0!wKYG+PTHzQiu@Wn zYJ$FAKB(=3fTOJ)s#~G=Bp~mj`WXc8EP{9IakIXQ4bokKm3fm9EU& z4>xXV802(!kTkfxUzoN4gg5bFh7Bq;UqNLs9zzG800$qeK6D}cI)ZN;&PRSn!K;o! zcmDT8$be_Tkf*d0h5O7Pp!yfS|MC%hn6BlGFF=lnqYfSiaHw@3yjf`XMe zgSz43tUExp7KfmZgPVh`FDf-?TLR)T8<#7>ahpitxa2Nh0(M0-$_w8M8nfegTYT!3 z{!ylIfO!oUg^1FNA1W4hCqVmy`CLOB0-qL+kCU;(IV-2^t<-VKhPFH9gYO2umt8vr z=x&1#ITN!KR>rEF(#9f65o;&5zV!p+3Gcu`#6t~_2M|{$?JCO&n~5>j6|i>h&h?93 z7_8qImz(m1;@N(rfV?L|v=O|hvmNYn9vuD^`&vqq@XFmv1B66WHay}BZ;Yn^iT~08 z!wVGwYk$VH{O%!ma?5O&>F{e2ux*kTnOYYc($T=Pmo#6u5{hkWT^J+J)R3JXWA zgL=Dk1Xy}}64>Ja23R}}APu(3Q7dr}|B>w=0-pMMd@Z2=Cok*R1IPFEm(ZP69+9Zo-4( z0>E(k*VN(Y!clxmHAbVCTQAVV;!}g2UN(d4TUvs*4HrT4JMecWU&B(pAgQEf3;Ab+gtBFFdoO8~Yrr{QhECEPauE>17MzoVtkz&QBJuJb2@+ z_p{Dkw*4n#6?SI_{5(2x5};liq8s}T>=P$Y$G%|1c}SBe92ZZCW4E4$S89Oe_0ENm zk!l8&kVpOp0a-Zi7RFiYK7Toy0Qoz1A?qjv=ihGswhcd~kefOX$k)P$HsmS*ZxrlR@CGs2r>zR*Gh>{*Y)(ZvUK@``OA5SN9> z8?hg5Qh?*)#Ou9YXx-(>a4Ii8GoP`}g8ntbn~#7r40l`msG(`Gh6PsJS)d7}@(uLS2OqtmaGy(P1|n@yjw!X*1> z_j40Dl5(hy9-e^?$G51X7^5BnR|k%ZFAzw_W>)muyhmc>e!+!bOI>nNhti?E)^N9| z-pCa%!yKU|b|=Q@^lw2(>wPu~jA+Qf&bql$y0t-qV!U(&{|>BjhEVKhhF z=QSOM$AfRbhc?3N-r*fq;{7fsYlG(Tee?Mv0oDJC=idVX{Utk!oM-glaga}*;V@Ob z5i|YgcE&Uh!v%?-k|#poqIXRpgR>qep{BND_zBdGf zw&DGYu|PfzqR$9EV>ll{c6H17*q4IhOyj;$-Y+YDQFc^H2SWWGD^G;6*77t2H_})g z5$UG2e$SGJi`>V!!{eab<+<1S&Xi20)I8bQrcBz_uXE(h-T<4U1L{_v-@(=iwOx1d z@I_r8`MH26XHe4s^K4v1&ZEI_d>mizh}56GzofKo_h!?5Q5!W3zj?C_kl!AEi{_yk z1YRVrEh1obtxCz}BnjbnO8tgY(VQ zPr7pIBDCUWc$?`Z0kglyf$-#i>w{%a&^PV(kn5q7@VLlu<>)&lpAJx_Hb$Km!<{az z7&)@g4(wTvYm1FFh&%Vg8jTn!ufMGMEXUjFcSuMn0Bls`C`2knb zy#i-@bW3UvDXsz)_1PL!LE$L?%^JTm>h8|RB}fqSdS$(ie|)$QxaZ-xl7r{*VQFc(C-M9syhT~!{l+pEKEjFk@;NF1a5^(LAuE@E>RUYp%_#7wSylB4C z%vKhVf#YsrP&IUq`kO&P{`B-n1phTS|2BO|VjKRg4GQZ;AaCeA;vTl?Dx4Qz<}%-D zj>2j8<0q>u&la+_tftcZ+yRJf=0zA)(can94($#@e-}U0EiCNa4r{;>V?@4J;JgIg zf;A$dyVw<-hVX6`h9=QE;^gGW0E+*~yS3g}HU;zckf}%T$HDoDg9@tiS(D@i=H6dz zPoTN>c&^B);0B=kzwn#7_&KjF2((;a+a#=L)_v_5f?U@fgU16H13%O6Yl?I1XCZn{ zp(SC@M%O}62kZpn**s2;3)>^|vx4K1xh({LOD|Qz6%f;83C-mr>g7NBCKDiE!$Xb_ zmekTT1l|ca9&Wds{jm=zJ92x|67CZx$llP_d3IcA-6xoXGR(o%)^$Soge6Y-GJ@9` z&b!UHSnJyu-hUhqEFt&yBKT16C$Z<{ZN>xNnr`Uv|G$g_mH;*@1fM;e54ZW;E895Y znbx;r)u%F}y^k7poEx(Nq_*YTT30N`q5aR|eF?drw1e{!E@?h7xb&X%kC6Bv&aRWJ zC#}AbYfl1)|AqJ8ea}Y7@D`Cj@;$0_zuF)5@TL<6(Vb&VS+h)!zR-*L0ejbH2!304 zZ!ehr!TFDkR26Z**mNJB-!|{bSYWtYJ}g7)$A)trxgSQndnLafv)pj#)X4*!Ay4s(p4{8u2cx)00RHTs~wE) zfG&2J835$tw#h>9A>P{p{gOjXgtxe@Uo5QzRb2C*q3gxb%LBx>=KF`?y{0c+1me9@ z(*t;(#6OA*kAJB-BF;HPNOPw(^uX|Ki4${x%qCvMFyE{%){w)ji|TJ6?*UTa{6zTe zge!U6U%Brz*Gu#ji5k5u)%eB=P_FZ1Sskq-YjtEMLdRq{9+^kPT%Ewt&xP4xR23|f ziI-Yq1AK1*J2&t!76kF8E+gK7Hr;{a;X5x+2JNb=z1uJZm|EWsdH+U$JYyFivVr$M zSr4Pj-1!}dJaXW?xS}Vl{4aTMMP6|Zef>KuEufATpE4NO{}*0_^}zgwi3boo*>D~p zzmj(9RTwnwM+l zxdc4VW^^B!zY0BaSQc=+aIJhpzB@2tS(aj}@-`558rqk93I^|f$)wuc|f%_DmC%|wqzf$P| zkNv#f5weDaZ}v=$<+Njk4C2 z4A}~^*$>y{>kmCPWatGBA@R2u7lvyoZPAi3{2n;Z5d75${%@-}t<}yrx}?)`eB6L_ z1w%Uhco`tFE&tZO#XKij%iD#^1i@Pc=LL2u&e$GHs$F>f@Peh4>j`hl@2vyTfWSZS zIy>09`8f-?`g(dmI$L{oBlupz`EY-&lG3-lH7zi6b=0pyzx>_NPj)6@vORyZDx z)yUNIm=l8f`_qoPS;)UO+1u3>ggS3P9F$|$%Q~KZ@SQho{(jtw?AssUe1MX%w92hl zqGC>RVP1hT+%<$MdPN4nJ_O%i+yUm5@%s%TuXk`BoGaAzH8Hl60<$&8LOCOs`i{=y z*v7*Hsu8?&c-;rTZQZ&s0&`~bvdC(%?}YzE{5CRnXjq#H(0Y79kV}vACTRO z7mPr~#n;Xg_2?=1zXAaB{($F+$h#fR4;;2tvZr-;ZK$u-N{Smld;ql@Jn{b~R!zm%w^c8YA&%;^OahJxs6p)4EZqc<2z)b#fpaJSNaBvR6 z-wWpl;-b1TQv>xL@KEt?NxWg7-6=m-utlF5Wkb zre~S1hsF@-%kEBaxmJq{C~f9N_;j1Rk#1ere`ywZ?>YpJ15iEmoVTyZu49&h`(EUu z`xARS91jXXbq(?NcZ0cQ9e0iyxep(Ni#aNfZ6-Lh zPuR(6P9k_wYZUBpjk7m6nNVXmjH^IBLWU%F&$FK<`)VqIgIn_cgG<))#g{?6cWwFx z=fw{=b|6`CckRP_uSN4>iqEfR@7Q@D29QMZB3y#V7uy}^e7W)TbKv? z6|`6OO=A&0*}KB;fMS%fW6*|96< z0`wFCrnN?d`hX004Z8k(7i(3ut`9rwB?Lb5J@D4^iQv}wTNeg%Ue2!djt{~22c8dp z50z%_FXIDqPM?`NDJ9g3=*s352La`+`L=MPcJTVu@A^OnUz={sp&RQEc2(SJL>w#d zIEa!aI%Tge7nQi$lzX|&ERP9|X+N|FwEj7cHTv~fl))&r9w1P>SRHY{-%J7L2gazh6>nS!BemA?NW4q06CjnwRFet_ZNvW; z!-IUc3lQgi&4~BfxE6F#1%uw5O2f>uDr1_5S5J*+z4r!WH}hfYX^VaUzs)@~CSj02 zo#F>VZxVRE1U3U>xs0!6zLD17ay@l`s4v8}L_rCV_)mUA7xZUKx3DzG8`sB(;3bCh z5=ysqs<%h1%(56vK0fDaQ&zC!s@E`}_%~kg8S&P2M*7zy-3h^u59bF$vIg3h+49_q z$ost+a4TzcFVAbD&NsH<$JBYv*#fX73A(L-`ziJS{3--50fKkv^}U~qOXc*`jI&&a zMLx5AO4rj2{0ClNQ15Mcxpx>N)?v-a{jo&Z9j#N(YVbX)e0l_}zbLRgDd1}X$k6*? zw6lCSw!>?AG*KYtoo4hqbgXj)yk8CbMA*37GCpNr=g2(OJ~8=CScnIp^0o7E@$&N( zMB%R0WPO*tu21jN7=%81;kbaQbRA^Iz%E}m2h;)^d#MEa ztn(rf0*@N5Hw7I5yVa?Zc{!0K5z(tG_KD<|TTn-V6zh1H>2@veKhb^&JT^EU!3_cP zM`Y*b*`!oOO`X3JnW};PNIr}~QQZOdp>|NGZ#4V}9tJoM9y^)9;j;1+_HN~IT`@yFf0>I# zCLaJXEFMe)0tX^8FRUR5jRy`2K{o_1C!BYi^LZxJy|9C=J3sp4##^4wulb3CSgHVl z&jH6L3#9hDahE%0%I-e3y#5+~s*c%b?T?DIqEusqP z)lc~pEK8S@WB~rHc(?ZilqVw>K7wyQJWrx5ilBtv>jGa+TiK`8*=UQFwGy&@2V@X@ z2ybka=a&9>Z-)4sb~EC=-8TMU@$>gN?&9IFb}zK0L(snGsGDR)W#pH-Pg40rncvsaau9%2|n%G=6rUD?RhJ;t?Re zHUHL5fzNTEp0lrL5xlx^Uc#csUzigjY!+4wdd;KlMUxd7xk(=YN}G5Qj@d46q-)m4 zeVA61i^FLhy-p4LG=c_9Kse!_4*id+RNVSSrDW>-^5evs1Ksqy~Oc4HdYxt<@^${WOcT6qY8 zrvk^rIivkhPH5_d)UO9N4#9iGbQ9cDDbU({iM)z_Z=MNM~8GHo@{e@T8&)LCev$`OkPZZ*u zvRMYf_vNE%;#EP9tc&G2sGPnQr9`u>105jgM{K2LNVH!s{lKBE}K`+{Z( z1fONY?g~v}uyWDTm%%c@>!^S*Am0>`R zvEGl~8rZpkhnZSIJnK;pM0|+%D!ANa0fyH8`M=Y}i#bjRj{F&KKKGOX5ZS=nqEDHu zg^uMj%qDrgPjTwkAl@4`+raYx_Q!S)?9jU2Ez~LcbJ=|VxAFo4kh#F>l!@{aHEl) z16a@(2peDeV83yNhFyNJUR-24R0#ZNI6j3j=?4!z?OUD3R*{QCqVZf8=Gn8(0Zd!t zW7%O1U*%0A0{&PYf8u7lp`7*qYxVYDvjJXnz{n&o#m0#9DCJk~dGWzn{UPdgCM*qVQfT5qib zvd;Q}$T$+O%OL{k$*i&8OzToo+ zzJZS(`{&er_X`4ITk-x|K|$UiF2wur=5#nOq441C_rucS)@R6XC8xftFPu&wHIzop zr|A9r3dSy*69xI)R?Z{zO@;Fjb9V-%`j}L6cEo=e54CXWiSK2s~eS{1n=wq$!!nyaTtNz0CO9syB2ltpA`b zKnCJrPt$97tERsZc#&{CLYy;?>*v#OK0x=0LU4@IOYli_+55PA8M!6dPS13@~5n2ZSNMEm|Q~epqG(`8ur;pI>bbg6Fr5k6Gb- znEWsf2J!o{#u4>Gd~S3b|8i}IzuCD)2CAw6z?}(*2n(@_N|H?8TU?H+Nj;KwR|Tgo zHDBTWA=&}d@jh^nRhXn|=6nE0N*ddFDvMxm`Uhbx3u2#8rT|1)MMz3bIGJiS5A&GF zE?gub?~N72{h)^a>@gsM`pX5&+eF0F|&_B@ILqL0CkAPJ*T_mWFK_H3v< zT9^FiNP6hx6|x(AE$DUv2(t>2*fkr3(%fGX)p3tg7%(04J^z;ACnOj6f2b~H(0yNV zn=}2~+bQR+mT9?{5LoQQ5!~wikC&^hC6y8bnOGyId1xId;D>a2fXHY#5s68fAZoM;2O)9Nonqw=UPKe5Dl1E5O+NTB|4KkgUNXD_TS zu=a}_b@CaCruc?ozHgo8=rtdkliO|I zIO7Ia@$xReAIoYAifrZtZXb+jeioPLT>w=?*B1ZB{e9#=8;oN`wF$!q55B%kyK4X< z{((z#^oz&^^<%fB1MEl0H4F~i?8jS|=XgGQ zQ>Js`bUuYbj`{JD#!;kV=nSzO*Vow3B0ZrkhcO|eJqc)xB>KGI`e|(Q+~4S7n|p9U z71z2}!X&R4)h$>Pju`q`Jc(#k(6peWSor`FqkZ$ER>1RJ?9O?*-y`|FrMp_=!zzkE zVo?;V9*6Yz8j5eev>iB=1=^#U=kBvjf$t^3u~(+9a*fcGD&LjtEdTBNLh_kUUO&)E zh@t9pGxLaL%3(Z7=N0SW-rQzsc3FAwJG{ZM_ds#Pm_M}bz&G{*2ikeVqC?{i^^g*8 zD~JoKewydeD(E_UsIZ@}rm3@llo(ZhygPB<;8TrVY&OB2R`*&{<5=NJJZ$5Qyy^N* z)wGb?n(EDCR#yH#Lr@73RI;pt#_#v1hgY4n30MjLB*OKI=R7w^jP3|p_etUzCG!b) zO%qPfeEjsnoNoV4h`1y>B+X5ww9&C}2Y%QCx(nSduEiiMT77q&TM=D8nsdtR4|tPF zZgLm35Wiac!Y8mD2)miSuF$c^Gtu3jkr<@q{AaeeW9@bnlyO+`WT~V&*%!9wlh5t5 zDt#WWbcbxTFv_n|k2v29tzOl6C~;7cboH~|wf&Hxl=z*$>Cny#wmBOJznD~2C7dZC zg=DN7KlmX->Ors>ry*OVlAJlwF#!=Mn;#;2iC6Brig?-h?k;Q1zdop{{V!f#eLqkP!a(N{C%E<{{<$V1tNb|T_k zQ}+d~T|7aW7c(#|Y`n79DfHO6dVje%GyUOiv!+#-w`&I#pcG%NO}-K)#f7Dul20cf z{yI}Ik|DMs#i<8Ap4q!`+bBNLYH_=Y)c=->)P$tick(m&^Hi4ZTgFA{R+6Lw27ASNFIfetL>q zyI=3E(pb#`Pz!Wx%w$v;mtA3)xFR1_Wc70Y}immYC}T3o*9E-&elx{>8TY{oac2>*wYGYKBgj?81c3<{f;E9J?4VI|)j8{ZoLNV{j;Jef){_sYy z{eyE8Rb8CkG&erN#TsN%((R)Oh!{8_NZ#UJlKN}m=WS3d2~<=i(OLyH_l{?ksc=~9 zXGYze?MdMWiP7Ej>YbR?vjHDQBC?znC8W%f%`Pn`pw^kbsF_}figz3D(bs!7;de;rylJMTCWVRVQ#AOZMyX_eDl;jKQNl%*Rd0D2W*EU6;yPVrW2uc}Hqiz;SE#!5`ynY8240^Mo=(S}{k#>>c@$jt`76)deIMBLM!Q~b`tj)3&l=Ey7dTGkbvYkt%bBs?Wb%~B zZ?b2OFaP!htrvRjWET9<$vKR#%Stt4b~TbJw=jE88K@V!$d5}Ojo0jvk1E+MNuqtQ zn+(UNbuSclhhNy#V(9`-r{8K{{_K$)>Z`R8P}t7DSTf=lQ_d!u1mT%DeYr-RXDfx# z3ti+-XLG7g*YXyWdDQ zBgr##IP7I4bA|cN+&8qjk9)z>?4-3|BtgwpwnKqaS>Uj zD`j+!LrhRqrd7HDd>k_?A4DHE-w4MaE?LY@f})znx2EWnB|80n53@|lpq4|fjYT6y z4zztb<`PrBoIb}>IB`R{B|!*(A@9ODNRG1c_l{lpo(d5is1H*7X+7{lHgg#w)|b+l z&oh1TPL;{v`b5c{!kw#1$`EmI!k*?g)hS`KI^^n=hknMy=7rgz*VJprAK+@y{D#mk z{J{x0`=~a-eM~bz0o`IFZeghAsX@MPZ*Z z>O7xgATfH4G#(y(n74<(tn=AbT0!;6XkgN4H`tiaD*Gg|O?@7fU=OA~h;P~}?Ns!w zOdpEs-swAHsa!b{->4ZWbSU>~zn=MlRiy2f-B^$5L3bI|^QYzVzpCRTr#`G%$L~nt zZ8N;#F8&*rocCOQ5dElw(BV;+@0E%xL1B=b$=_(px^Z@qJrBth^tA~b|FZM!b4bo{ z%7lh!|D~?O^v#AguW0k9Lo>6X!22m*%AY>*XYiH!obQXK982YoQ!#KkKN`J#vg=P> zu0(Q5?maKX?niv;Nsznj8P&rY!w;C-N`#XZ1e_k{aqayC5m(3oQkVE`vqJ}jv<6$A z7&dcU>V}A=gM!>Sr{{Qnb<8u7JG31-_4;tl+NyHx%d`PW)WjG6G0Nh}a{fJ5qcPve zl@U4H5<6A2Am}M3CZ6oX^E>8ex`(tiT?BiA5^tV&0|i01rZ(ahs|UY3D5w&NZ#zv4 znRs7a{sWcyp+5T==kkIykwayU$&bxjM?^j9+gHAOFC$o*mp(gY=2J^vh*WCCgN#6%E#4nUvXn!+ z!`5Qn((EZI|1@T$C^N?)vh!fh`x8g1ngf|tPu>-O5r(zB2sV$SuRD7F)^ObcwOSti zektMKsu;D=BP++jU_RSwhtcfYnEfAFEwAB-1XMu=ts>V+KT(>0?e{7t@fhA7Uh(is z%nC@_LHBlt1^cM)DNd!#j+-)aW!*K9UPsw2kM=~Y)@G|J*|9r#5srTi4qba9!4H1h zBx)llOj6QJcAwv%mEJ8{zPHUlaJVH`Ds5xLULYEu1{^}~TbYklq^P}#mv|lD0FBsu zkFehz0k@4c0mE9?hoiPsL^Y$3UKwU$()%U z**z0l>K50Bh})_euZ#JyFb##7jjg=;t(t$I2{Rw8x>3BO0_oQCuWWL(I+> zV+~a`L#I_Bhwv)X?K#lr?(qBKy9c}qSyV&@i)K)v`d{BZ&J$yqL2WesWAM8NQ(LBu zC*+W49i8b-yZygZjkZ#?&pC!m-H0%T3&PdUa^zhW(Tn#aG~A@GPEX>kCPhPnED5RE zJ}c|2!Wj&3O||6(s%FBMabnD_FLSuif}nfuO7Q`?`^Vp$HMvMkV?$A; z!P%d)19FIrG0~+Saw!cnhMF;exK>cEhMWg-h{i~k_CsHfywo^(wV$?Bi34|9en1X6 z`Jyv_ZfszM{>*6u5~sPoko%AE;DTJ=@tf<~*;BoX)u&Uw_eFM!aNX1Z1wmILG*tSJ zfKbglcaJk1-EtYJix` z`tzUOJ74bR+GB{(gKDsZT%GFqr-tfhlyUpw?mA`if393#7ubP6+zK337MJSUIon(2 zpIGF3(B2c53?P_o*f3FObm`2!WLI&@=O@y7D}%4fb3}wfCi+&Db&FxbG2f0%>qx2< zGtFJ0utg|z9XX%tZQnQ#?ZX>!wqZQ=os0aO1{8WFe_YYjTv4&9a?Kfv+!CT!k7^#k zLl+`Gra-SrJuLmh2I@m6?zbD^#Px}e45hk~n($cdL|AQjeZ3RrVhd(*m zJcz}?r^9XIZ`E#sh`+wLNTJ`;$y)6xbLz&z;pK^0O$LaVKhAk~a&UZOg9phEC*O>f z2-OAGbw$?KGU&P4=+NCPb+)jQMT5$zxx?428j6DA(2AfPToZp9KjiMap}L4(VU=S| zQ~u#QM4)k{Wa2?Hbu=Z|((&A>yv$Ln)JK*nP+$h7_DtPM(IkYxB|^r?)rX$!6{1jJ zdw<>-{q>4B(a9&|nEUuG%VnhoX^bN1x%r$yS(`%d?*XC+Q-!ZQq*E^)KVkN2A~t%3 zBoicr+=(Y{NV`d&J@+PQ5F)-J$$plO!>4N@e~@T3-7s9ysJsm#PM>=sT8dxvKuI&? zvYCl&(PabCJ8M(X#-SVfA|&Pwjl!XwJz4VPLhoOS(H0UtV0pUHX|miynT!%;xB>Aj z^Qz~{r90F}Uqg!61gftD^zEM4a`~OAD;8KAX5vW%1y+*(nf4{|yrsEuRpw1I>KNaY zq;M!OZhhNbdZ&k%QNVvPDof|~{IDiqv$Ve7 zTKg;;*hk87o=cvoo;J8K^X!xIRq-nsCIuxM9*HU}UX=_aaVY)RZThxQJJM?Aj25Jb z-uGF;`yZVL+ohZ7*m|`rJ-BHx$3a|AY<#<~xUo-3Fi%fU6pVguNWTgxqBnl7CGW$q zjj#;Cx#An;{m;`b-hz81OgrJexF}wF8^_x-Y2SUn>~+qGhx&-XHM|ZwD$bsM1EZyD zOE(<)4n`9~rSOyM%#b@!supRwqE9p>E`6D>ITa$N0vb!@no|=f4maB!AEH= zHz;z+$xZxBWpX>t_LC=wSrYe6-hffde z-k){kEIIB^`rbnKb&rUUXnT1E^hGJX^Zz0EC^9|4;eIRqJh)#%&ou%=Efw=ZefPTL zWf!hx8`LOvB@01Owf{O7(Mh)CdtPMXu)<7aUi_6)>6oa{|9n0q*NSj&*D!liR%J{n zjztrjTpQy1Sint{zE|4!?wYeFWv+Ml#4UdPnPX}ljFuF=CZ?6$ug7aJ+ecMZMoCaU zG!S*BnH-c9-KEC&b@%X<>aw4qJ}o-I$R*_v7l)Z=J)DYl_4?0u1#e7oYp6@El?~RXpZJjSnm#aTM$?WN zGMNj_^X|P@x?BOvBd3)*^T(nA`SVaMZwsCq>voUPH8(yY*3PeXb;&PpA4F`IGpRk_ zc&x7d@r}TRuDK)~68^84L!*s_F}gi7ylB-qEBs1LW70;ffa6BHWSq;_jiGm5dtc|x zV{=DNDzElkJayKav-trxWHj=ufWWFLp;^T@Hh6qqis3tSzkY^-+uus3(9zp;X|I!mPKySl6%u$L<|QYMQwFk60w zRME~5YfH{qZLBMmPWPu9&+Z#;D8k-*W9!oRixuy(j>=xe_Z`0tgr<3qkXUGM=u)3_ z`h0cA?BOTVPi5~2)~C_Eq_To^F&W0Y<{rS(xN>3Xw=Wkd$ysL3S}44j#t~I9i8fM6 zDOZKU$8Vf>A)XX2Zp+2EkREu(asfCCj2VDO9P z_hLUCjpa30t}YB5O8wz)WC8_9UzHQ{Ew9FbfW7poy)||D1Vd&wMj7-x6B~B_A*(=S zpNQAdpx(uc;&QJ)H$ciHEW5{Ad$ze5(M*?DcUtcvZ)P-th%df3v|~PA)N^QF=jf*d ztH`7)ahM6c=bJz6Qw{z_C*m^Aj>V41vtv97>&+Ve-4$T=nr~0+sD3VUyONQ|wcNw} zh-Nsy+lFUW6sij^72 zk6?i4gQ(h*cw?)MKaNlKc=U6QT)V&PavL$I47&L_^e`xn63EM(ne=6}tKm4rTpQd5 zt1ED@!>k(zdX)`&Cf&*W?8Ewq9ge%Ad|y3C<5rM5 znTl2hZ3~h>;n90}3`yDr9)<)iqY|8O5o|JWBTPyfNgMX60uh=tjl1|G0|7Bqcc};4%qdt_TpFg z;e6m&&1Khxu68`^OsJjO5_^ZDx+UPlXyt|2gHIBeqeC&$pof!S zKyreh_xvbPNAdfveytXN8rzaXO~Z( zpeNxA_$GNo+iuaZ03uE!esr@eM77=S%kN7&OMWZcAFwr9KdRaMqXfW}p-+jr+{M+s zL8RW+fq4esjNEN0mN$&^SlD@~-O;IY`FN6B)qc_5&*^l%ka3*zECXp1JbDQygU=}X zkHqwsXG&{EI4*r$;VMUM8}VlbTI;l$I*7mOiB>^sDOs0RhlA Ax&QzG diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/logs/HEAD b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/logs/HEAD index 7b3645e5..7c437b1a 100644 --- a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/logs/HEAD +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/logs/HEAD @@ -1 +1,2 @@ 0000000000000000000000000000000000000000 6b833ad3b334f1ccf60e0bd27ff5781e618e79aa Marcin Grzejszczak 1540290537 +0200 clone: from git@github.com:spring-cloud/spring-cloud-core-tests.git +6b833ad3b334f1ccf60e0bd27ff5781e618e79aa aeef09d318e80a96a54332a3eccfa72d6cc56689 Marcin Grzejszczak 1566838500 +0200 commit: Added script diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/logs/refs/heads/master b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/logs/refs/heads/master index 7b3645e5..7c437b1a 100644 --- a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/logs/refs/heads/master +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/logs/refs/heads/master @@ -1 +1,2 @@ 0000000000000000000000000000000000000000 6b833ad3b334f1ccf60e0bd27ff5781e618e79aa Marcin Grzejszczak 1540290537 +0200 clone: from git@github.com:spring-cloud/spring-cloud-core-tests.git +6b833ad3b334f1ccf60e0bd27ff5781e618e79aa aeef09d318e80a96a54332a3eccfa72d6cc56689 Marcin Grzejszczak 1566838500 +0200 commit: Added script diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/01/07e3e2d5db844ce7b88f3e4705d39d8acaf68f b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/01/07e3e2d5db844ce7b88f3e4705d39d8acaf68f new file mode 100644 index 0000000000000000000000000000000000000000..156204b0acaf5cedee289aeb738a4694478823b3 GIT binary patch literal 46 zcmb-o3`_cb(=l`7C&PQD4Sq!qu0t*4C CNE2xQ literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/01/10457896955bfea6e6a05c9cf880b759d7320f b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/01/10457896955bfea6e6a05c9cf880b759d7320f new file mode 100644 index 00000000..d1124833 --- /dev/null +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/01/10457896955bfea6e6a05c9cf880b759d7320f @@ -0,0 +1,4 @@ +xmSAnÛ0ìÕ|ŧ$ph'- +´¹Xq\Th`–S#GJZÉÛȤJRQŒ ïRVÛ¸©‚¸ÜÎÌRieR¸˜\~|7>p3Sï-•[—“‹÷çüú~‹`¸HZU ¿5–×ý—“ È[ÊP;Ì¡Ñ9ÚÕ*cl¿3‚ïh —r'uØo O¯ÅÞ4°S{ÐÆCã9ÈAA>eX{ ™ÙÕ)!´ä·Ý9=KP÷=‡I½âvÅ€z¦xÝÊ÷¢!<[ïk÷y[ÔMÊW ºnþauAe‚–çî`>øsð,Ä`>Å =Êù—èâ¸5*w'§Ü5xâEüÌbý \ No newline at end of file diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/01/425bc517960a423c57d8955fdb3b365460a881 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/01/425bc517960a423c57d8955fdb3b365460a881 new file mode 100644 index 0000000000000000000000000000000000000000..4d1bf27512dc69608a31a5bc7164cb3127e05e0a GIT binary patch literal 680 zcmV;Z0$2Tb0i9IuZ<{a>-PiC}ocNSfsp$_*(-uuCP16mvOQevls-}G~a1g7+X0|Df zrvC3c6SmQI>Zb7lVf)_myLWdarApxN`1PAt!JY?uFjdu7i(+lz=-}{ppI&dlt`QV% z3du|0wOuPs>+Z`if;r@+NKqQhpq3fx78F)IC2V&xhR>*tP!f*V0Sq0h-yQj*iKE!6 z8a8|jQdy`C5{EF5ixL6vQ>-iq38~strQk9}XoOw2_jD{y3EXrXDzTixIRUCIsJtHt z+;*bDJ!@+#^DYRQreVC5%#<#Ia+i<^E~Dve9?$kkb_ctXB^m=7ztuuh%E=aZMY2+! zkl2zptv`iEI_%VjuUMY9+dOPDU^XVEHJ%xQHF;rs?JqWRevkUXR6;C-cC22@7j z{KTv^FGgqjuZlrV=WcB(OhqnIN=+6uFAxfKhgwobP@&!kJ5OPYh$MYg0y zLt{TtlaV$54M!T?jLbgiX&FlL8Qz1B_nbNb{V~+K>}@cbIDh1wJk~Ju1KJeQqRu(Z z;*#X;T!HVNH+UMoX|E>MpDgW~eVDCA-XNwSphj9_S*juZ3A_iAxGVURdU+?$i{Mpt zLX!t+$*G}xnf2=2YU<*Q^E8D!B{KTi2szwc|K%%iU6>Jt4hGM9WH2!R0)>>++8U@$Z=Ff%bxh{`O;&dhTxD9Fi7PAtjH&(q6FEK6i?54v2m Zr1q=(rf1V@#b-ou=`Jj~2mnEx7D<gf0V^p=O;s>6XD~4U0)?!^vP6dXy%!!NWO40Vq_i~a!C9WH2!R0)>>++0zg literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/03/54ec3cd6cca1aabd257bd27ea2f3d368e6d2c2 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/03/54ec3cd6cca1aabd257bd27ea2f3d368e6d2c2 new file mode 100644 index 0000000000000000000000000000000000000000..86cbd96f35a82d8214959757c25cb2e9199534d4 GIT binary patch literal 68 zcmV-K0K5Nq0V^p=O;s>8WH2-^Ff%bx2q`T}%FIi3EGWpyOinDx%+J%yN-RrcnA54! av@KB7Zrzu´5žIRÑòë0ÕF͸ÀŠmýQqzEþ¦Îy|ƒ[p õ1P¨¤Xà ‚S`K­•qàZ`2‡a`©‡9ÈHŽ`Ä–(á(>ŠîÐ|ê@"æ˜$u dª(<„àÏ`­JÎV†ilf¸vð¬XÊÕsPf«.@3Ìñ%ÖW®¸[„~Ãç ×l3†A&¸&芷]¨Rä —ΓGnê~§±™“Ô€fÑ,üô^x™ÒëpK;&I³©p~$qñŠÆ^™$&O…DQëŒÊG°Œ%CI' <[÷qÆJázΔ˜&»YO°ÎnšSo;Ë2¼Z4Õ´©u…ìY‘ˆ¬dš¦álK‡‚='Áº0Ù„tK'-è-œÓö}’üêôDð©mq#¡2&ÈÑT_·¶WÖ‰NŠ’MæµÎæ«.OvêÓp_Xëù­ÀÂ;Þ)‰w*mU8WiT`_Ff%bxh{`O;&dhTxD9Fi7PAtjH&kIQ{E-BW_N-Rrc eSh;iMVv)37U;Ay7e%wFuE{rMgw-;2vE7 literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/03/b4edb024bc4204b4415e070a53968dacf26b8d b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/03/b4edb024bc4204b4415e070a53968dacf26b8d new file mode 100644 index 0000000000000000000000000000000000000000..c10fe5734b9d303706ebb0391e4cbfa019051931 GIT binary patch literal 1030 zcmV+h1o``T0o7JfZ`(Ey-mCp9IAag%gT$oWup(eobnDg?NY&9H%8-6)kTdOWG-fp+~_DL@F3O_zOJI5ccujb{N z)imRcv9u}KEbQuc)bx%uIaL(Q{Jxvl*Z7D049=cTCJ3Bg81Laqmel&Vy0eb&M9#uM zI3tsLQ-#UQACbd&R!k?PmK7841MtEx5j>cig3(ILR=uhUK$jb(ft01DHQP$P$x9*I zDmS!Nf)N}oVH4GsFKKCEU)Ym*(=3=~4YNzZ?=!Awk% z24D*mZs-c4DsG*lhoOtTfk00Sz+1wOikVV#1&{x}<676UrKL!yRM09o%D&f4b#wnbH(AR8B_-6>WmSrhF4TUf`Uk+1i2+4U7#e&+K?H(gAITRj7f?L1)g}A2>oygIN-1O#NHwoZWJCT8&x?NCAY#c{h%upal^${y3wwFKKR_yB}&67KQU#_3- zcV8F`Yc<=j?>Md^Uz8PeFPl)YqH%c8P-A zn;vDc&;H>g&c7B}9>TGYc?7N()BixCUj*9PLI6D`YVQqvp2Z8XebM7^_8E+a1-qXn_5_F<(G6r+nci*PMOw2__p~<4=1wx_jQA>&lD%4A1TwV`N_$WivGP>~LAvQle%zwY;TBb{$Qn ziO^j0B{oXmu@t#9Y|b;Q^onswW#vh+sJ5zciQ75gz+EZJEYV<@k`^BKLOzyKpA0?jn{9_fNESBAWQt?*YPCUc_|(k z)*A0PyY!D=f$=(TrD!6w6==q-@;}vSCq=$^-gTLxDxqR|EE41LpKTRcWDIJ{xPQ!a zjbwY#)mFdFc8fuoB%?uiv0DP+#V*gVs#BT*;H_a+>r_ZgtVX_!+WFv`!WEB!Z($f* zY$`Df_SAB{-xkffRLI4MM5|?}}#U9@Uzel?Ej<#TXWpY^14NtcK z-2oZq=)BU|?ckU~Cx3p$FujDb>;~)6qC_(#KEduFk-CPTCRx@>w1< literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/08/3658b0e220a59e30123517e74d212c2868da5f b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/08/3658b0e220a59e30123517e74d212c2868da5f new file mode 100644 index 0000000000000000000000000000000000000000..d447ea981e031f1761b9d4403c8ff7540b4a8ffd GIT binary patch literal 572 zcmV-C0>k}y0iBc2Z<{a_$9FA%#S^ErN=??CvS?CSnr>(vkwUtvM*|OH6>QHoB~i8i zeb0n$>1Bs;K-kaUuRrexd82Ze&u8zVivTWQsr12!dgtJ3_Wr{qz2@L{2#Pj^50F!-|*hEmQCz%^kNJSW(O_d|VZ zgA{YhWA{clA?qnvRk@xU^sJ?@&WOBoZ>lzC1C;ye0je995XKoKSqPuwEXk(cM4_bepU)SZ`ptPH&QJvQBAr3vv1g-;(rZ3P?4h?%-YT|_y>WtqgCmSLTTojp|CKG|CD^E!nMqFNs;Y#lLht<}4SoWL(lf z4LEE=9YgEBQ@7}j|CS^D10_*kpRi0M0mCNpXBo{E^`=HQpWb{d9w0+@jnDd1F!|^?&%7$ zDekBy_;KrU7Lef67kdk^te7b^SB~Q19cv_tRbEPs<{mD3>rfJ$nz~CA)l696@oA10 zQreW8F>;(u21?PE=`6%O;O3E>7da?2fAjU@^}B5T*YCIU51+oI%uI-8HE8C6-BP>8 z1tPy@8LFkcZxsr$(NfC>X{My%R_YzfGA9QhF(C51C?+asgWU}kbj6wowPM`|&WywE zD2%3l|1=w3277csghT~t;j=z6+;zwYxJ5ObAQzXX-6>Wm*%0hkF82vBrG!)7D5;@J zVdqgnxl>rK{CmKYgFT9zFf_!31_%VjxsfkgUPH6UR+sFLZoU+Lya4lIwv5|2h27By z8XKWF&o2nxJ8>o{b-n3(&6wEmay?MYsJT}`l76a$h^HrF7wR9|er!Mt#6MQ-J@s$c z;;_^y)$Yne#XUKqemnyhTP=mQ_)pUq(fv``$3Y;NUDkYiWLiSM?pNY}ro}P?9g?)F zZXuOSeX?*(5=Rktw3yHOH0CybF{RgVhGzlK?eJj@>_SCV8saZ}UW zbA^E9TJF#@yXFSL@2)i#QRE;acr4qRJrDEKjgy3)aBuKFcKw8uQY`tZ)&7wWz@d}j z-ook@-c-MIOhdVcwlFw6eV)l~?WiQUBN&$bn2-J2A9Vf8`#0JMs?1ti7`AZe>+9di z?j4*ze(s)6$g0(K5&w9&$lZU0oJ$@9woh@P68l zum&g^UPEo9aBs#KjGN^9NjUm|CjeQ}+CbS(N0I;w1?p7zIlj)ZY@yQq@c?#Y`v~fv mTfDL44}lI4^}HW}^wSGDf+}`oU#Bqfru`FNO#cN~ge>VMCF&di literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/09/4f552a4ae55d345c5da650877f66aebbacc180 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/09/4f552a4ae55d345c5da650877f66aebbacc180 new file mode 100644 index 0000000000000000000000000000000000000000..45832e3d13cdebe20c0808bfedf008ec6a826422 GIT binary patch literal 79 zcmV-V0I>gf0V^p=O;s>6XD~4U0)?!^vP1?(_Q#K|-fr=EzN6pHo%QnEu2bLoA<{*u l#rdU0$*IK*J$0)#D(E#mFe-?sxc{Tu%# literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/0a/8f9cfaa28acfe568882c787b4016e9fd0bb186 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/0a/8f9cfaa28acfe568882c787b4016e9fd0bb186 new file mode 100644 index 0000000000000000000000000000000000000000..be2f928653273d592a8cfb9630205690b046ecb4 GIT binary patch literal 156 zcmV;N0Av4n0V^p=O;s>7v0yMXFfcPQQ3!H%bn$i7%S~Z;==RT};aql5%gvXv3%~[ÔMÆ«]7$–V˜E‡í ‘g^„8‡OqÒ·?[ÍËȕ޽U…?=ãΓW!^Å/çMb \ No newline at end of file diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/0b/ab2242b6fda577c3131bc19b14c3cfde29c3fc b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/0b/ab2242b6fda577c3131bc19b14c3cfde29c3fc new file mode 100644 index 0000000000000000000000000000000000000000..9d27d3fdf286537cdcd50a927280fef1dab02304 GIT binary patch literal 66 zcmV-I0KNZs0V^p=O;s>8U@$Z=Ff%bx@XId=Pfc+}Al(c_XT*C0_|ViPnM02px-SzDkRlK=n! literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/0c/21588e05ccdf40ee8eeeaa1757d07bb6494bb3 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/0c/21588e05ccdf40ee8eeeaa1757d07bb6494bb3 new file mode 100644 index 0000000000000000000000000000000000000000..5b4502c5384ef3fb21f5c993f578017e870447d3 GIT binary patch literal 74 zcmV-Q0JZ;k0V^p=O;s>6VlXiP0)^bf%shto>p0ZcRGSx0kUJnh&DpU<*;sfTM7kuk gxP-y+d&gQ+$DO+u*_d)L2;BSEHp|x;04f+5v8`<(=>Px# literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/0c/2f08558d3ce04a6b06b656e2485507996f6c4e b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/0c/2f08558d3ce04a6b06b656e2485507996f6c4e new file mode 100644 index 0000000000000000000000000000000000000000..1040ca1edee038528e979d980715e60f17557e46 GIT binary patch literal 954 zcmV;r14aCJ0mW5aZ`(E$?W_GOIHM2SgG49YfG%KEZ0jeGtijwCeWfMZWpm6mgGrrxdC$3DOQDwN+5ETPpO6<1wLtew8?NN#>@1(p5R;{Y|#^>|-8UB2IwJ0~NrWu#U zQdzQDu<9*pde3A|8wxOQck})l|C-O??dfEK!1;yo9$oLy2m|4aAP=Sr zmzjSehx4qMPDrgPCO!q?h5tnG;BE?_wN`EOt}1|CZW;}utTe6JR_VLE6soOqL+eH` zf+G@)sJ47XOAB_vCiBoNKr=;KyE)Ikw5=dG!GdL%hvMnKsbSt-|3`2H02buCqicw$ zxTTul$D@l|LXh8n+@kK zlub1{B$C5qP%+vvodv&p`aBABo6+D%YQ?$_oEgX6 zNf@F2{B<>aISk|g4@o7Y$1yZlZ$~wt}rzCghmJg#rcshTP~n!RI5w&s+%)~A2XnQm@$VjuEK8V zJ&ny!oaN669^5!cDqRnKqZyN1UT#Jea}e&UAPGOMgvh5CVi)os+yCgG7^eGZwqyN= zA+ewDRB!k0e%XC{UVUd6lG&Bu4~K>ow8~I~?+Ru#5DqoKU?Ny%pg5B*@f8}1HGJy} zcQ3N!=+g)J^kwK3Y(xt~wCmzu;s%zv;|&6lh1#K? z?S>l!zuVSWM3JM6U|+R@{Sro(>*Pe9@NTd^_WXpDO0M|2)qc+g;?P9!Zeeu`Yt8?4 zN<+HGSm;?VpI5T`@1!KS6Bz#X6E?O^f6=uL@7JV}v@siHVa~y&&#zxm-3nSfe(p9G zMAd3h#NF>acWXN53P*PYJ5VT>=)xZ-gh{#-tm??dlZW=^zBULRhW$uu#G>W`a-*ah z*N13aC*M!v(K|eW$chRBX*-=sLM$YxtHOWcVvK1EneMMgw4>TbSpV4M9SVM*=!j9T c`w>b%Jdp=j#g6Rr6eixZ->${gf0V^p=O;s>6XD~4U0)?!^vP6arhB56M&qPQGE%j#KnR{YV{Mq;e5b2`S l;{4L09WH2!R0)>>++8W-v4`Ff%bxh$=13aV#jv$xKcx$;{6SNi8lZ*2_vPOJry$ c(TLew)N^vp>cp0LVHa<#%elW20EmDY27lZfHvj+t literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/11/48d21548560fbc1207d86bbaaad2db6022d7e4 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/11/48d21548560fbc1207d86bbaaad2db6022d7e4 new file mode 100644 index 0000000000000000000000000000000000000000..fbdc9523351b4ae16322fd4ae1d05a0e869862de GIT binary patch literal 88 zcmV-e0H^AVK6i>Ff%bxaLUgwDK05WEO1FpE~+dj$;{7l&dE&8D{(9+ u$jMAj1PO$s7MB$3WhIs+G8`8>&D_`|6XL6WiT`_Ff%bxD9F#%tH{k^I5|)M#2==)V)^U7&2j!1QWY;* n^2)>j2o#Eok{P;wM%JajQZmR`({to4)3nxrrF!lF;z=DHml!41 literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/11/9d12c26cb60ad71c7e21c8ac5da8de2aca2568 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/11/9d12c26cb60ad71c7e21c8ac5da8de2aca2568 new file mode 100644 index 00000000..541c0769 --- /dev/null +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/11/9d12c26cb60ad71c7e21c8ac5da8de2aca2568 @@ -0,0 +1,4 @@ +x¥T]oÓ0åµùW}êPçŽ!&A_Öuˆ-jÊÇ„xpœ›ÔZjÛ!«Ðþ;×Niâ«m}í{|î9÷:-u +ONNNMGðæºÚYl=yzH_ÏÁm4¥â%ðÚmµ¡u÷Ï2Jó™—R ²˜A­24!iVqA¹ÝÎÞ¡±R+8fG0ò¨Ãnkx0õ{]ÃŽïAiµEÂrY"àÀÊT ô®*%W¡‘nîéP<¸ê0tê8ç”PíAçýƒÀ]Gügë\e_L&MÓ0(3mŠIÙd'—ñ|±L‡D»K{«J´ ~®¥¡’Ó=ðŠh žÙ’7AŸÂ í9íi7F:©Š1X»†ô\3i‘ií~R­«¨öþÒ+Έ“!œÍ’8{÷ñæåêíÞÏÖëÙr/X­a¾ZžÇ›xµ¤ÕÌ–Wð*^žI3ro*ã+ ¥×³ ^‚^ô;Ç §}¿¶ +™KA¥©¢æB¡¿ QTThvÒz_-Ì<¥Rî¤ã.„~tCÏ¥I‘Î×(ÞF±ÐÆŸ‚ÙÊnnøm®YªµcIÎZ‘=òô·)Ô©Zh•Ë¢6؜֟‚ˆR×SèòRÞ0ò)ÕŠ­ÃÏœSnM&^¾‡ˆ[5Ù¾gÚÍ1!‹­f~ÕB̵rxóHk´nƒä"wø”¨tmvÜÞíPPWtˆŸ# Siÿ=¨Ï¸¢íÀLÙwOÚÈBù™ékBÝpÚÚý‹[Ñi_ýÑ0×zxà=8½âÃñ‡× ðíã_zsÚÎ:üî <£Xè]jãàQTÕ)M1ˆ’Ópôoë5 |¢½–êôÓKͳ3Nc!0ó‘6z†4ªV[Zߤp¦ì%®BôŒÚ¬‡Œ —§5f°úêuEÏ^è¬øJ‡]m(là>™ÑÔ]Ên=, é «Ázû|Ñ2£ZªQBï–*>~n +KwDƒÁ½ e¦V£4¤Y …Çmú4ÜFÑmô 0,Ey \ No newline at end of file diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/11/cb65c3f7fb479d7d3d851b69749489ecb9f57d b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/11/cb65c3f7fb479d7d3d851b69749489ecb9f57d new file mode 100644 index 0000000000000000000000000000000000000000..00869ddb76e7623a584a81d2168344222949e41e GIT binary patch literal 82 zcmV-Y0ImOc0V^p=O;s>6WiT`_Ff%bxD9F#%tH{k^*m7pxNwKqK%a%6fKbPisp~j+j ob&81r5GWKEB{L+sv)+z8!IwR6QfQW-;mIA2dW$9i0Kq^TSE6$xV*mgE literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/11/da4b03a553337d470c099ed7a5066937fecdb0 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/11/da4b03a553337d470c099ed7a5066937fecdb0 new file mode 100644 index 0000000000000000000000000000000000000000..528682dc64690b62f9524cbeaf4f613998f264b6 GIT binary patch literal 62 zcmV-E0Kxxw0V^p=O;s>4WiT`_Ff%bxaL&(5%S;bWEht-D8*Vz3L0Ov{-_t*d%asU7T literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/11/e3fd26e437b71e04e367b2996b53085859d718 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/11/e3fd26e437b71e04e367b2996b53085859d718 new file mode 100644 index 00000000..5dbd2045 --- /dev/null +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/11/e3fd26e437b71e04e367b2996b53085859d718 @@ -0,0 +1 @@ +x=KÂ0 DY÷¾ABPe…â°aç¦.D˜8ʧNOÚ´ì&ñ›ñ¸eiaÓlWÁycïª@çØhŒFìø°ø"ß”ø(¶7÷“ ZòŸ …˜ Í’º‚ê ( òÅ<ª) Àaoñú«yУá3†¨ úDóg·ìZ2ÈbË”ýVQòôÄq¬ÙÌû£éêy1vÔcâx›yÄ肪뱗RK¥‹F~HîÐìwëºD×Õp“\ \ No newline at end of file diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/12/79683cf7367516cf4a58a114e39c5d9357a579 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/12/79683cf7367516cf4a58a114e39c5d9357a579 new file mode 100644 index 0000000000000000000000000000000000000000..51e8135410e75ad46dd7711f222df54b33e6a955 GIT binary patch literal 77 zcmV-T0J8sh0V^p=O;s>6U@$Z=Ff%bx@JP+c$#>4lOwB8CEGWpyOinDx%+Cu+EiNh6 j%StRuWLR_Or9+_m8{?qH88IA_v-E$mAD;{WA!`}!wmBff literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/12/974ecb781efc46c1a17b45bb617c74efa18a16 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/12/974ecb781efc46c1a17b45bb617c74efa18a16 new file mode 100644 index 0000000000000000000000000000000000000000..2e25421b7360f010fc33fbcd3dda991af36036e1 GIT binary patch literal 66 zcmV-I0KNZs0V^p=O;s>8U@$Z=Ff%bxNGvGG$xKcx$;{8wD=5k@NG&SKOf6=xu?xv} Yh$u{7^YBj*pLB+%_VE+x05Yl-7Z3UxDF6Tf literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/12/9fbcc86f9a8f545edf3a98d71fa2a4b9f5b76b b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/12/9fbcc86f9a8f545edf3a98d71fa2a4b9f5b76b new file mode 100644 index 0000000000000000000000000000000000000000..9e1367deff186d98441b9d514edf11bd67f37059 GIT binary patch literal 78 zcmV-U0I~mg0V^p=O;s>6XD~4U0)?!^vP6a~nZ_9_1m)HhMNJEvHQm0aTFlA?B3+bP koL^d$oLbCqAydJpT_)N5YGBI$slifO*9u4&2Fq_m^j3dE3>X0j9{?g~*kl8OqwtV+pMA!sGtBJ9&d@kr=h6GP{Y z!<@sRT9cmb8xnU7X!4(hbCrGG>8w^O#sg%g&Ad~_gly-sf8HC6dk+D-al2Bbu$GMY zSWAPH^EL4bunL|7Y{^%FpSclu=d_2tGSW#kZ4tW#;7k$LS7SZlH&;njq$yQ5KeFzNTkG#t_SaB$I|^oIjHy`=8o9lh=k zF4`o(8PpMXmGK!sM(Oz!(?H%>c+$6u(G2hXv#mrSXR<(QYF_iXpt-&kMj<1rgjq`K zb+rIE^^i)rl#aWww5x_al{!fRo^O1hsaWchBmoL-9DU%ooJr04s;b@C8Nrt)2k(?{ z>}qtm^MF$9L#?D^6Jg!fc(-h7rG#OlT3sXeLq}T~q%bplDOTFtuv}}$9OAG-D<|$8 z8wZOstbY;yN1fTV$b0Hm8m*Q>9YXzftd+=F0fAIZa0GA@0m--%2g!alf_JvUKq_{r z3to=H|F>ZJUSHo3>=nMoP_ee(w*{&S`iq`&(yi~c5A1S<77qo&E~If%*z?Hu_gy!_ z1kIl|`aoQ0ywleD;03CCQyX0i8XV){r}weuayGdyWe_ZYRHnDHr1BJ z@`>;uBlbT^PUGUHrZR}MR~Gbw4(o)Wt1pIc{(L(eP2haUS5nnE#twzh^lI(r$z3;& zBHw?$Xf6GfB(2kb6hP9F%8_q6;BB3H!=%+jyVVkN3oFB$>Ybz$0;z91Lcy5}kV9DuYb#%+i?fpZkB(I88= z`>nVo1zFPe76XoujeQh2OV9X}yk51%DKHf<-W4?)zTWwIgyUd%4!i8=E3vN8w)5>~ zVCT*uUOIfe2f>Fq)6;bf@cG-kzT{<@V*vh_?1JR9Gvm^8_W$E~X7n-~MYD#wAEkW} zdjpx{Ou5Few;HaqMvAa5hsCX+APY11A#+GE>M zKinYL0S7TPyj}&i{1Cum=DG9b#tT<-r%k7^Vli=l-D|b>&Uk-Ada)OZ=}M?5RTgaX zwG+R;r@Wrcz+{{@VeRpw4<46I>qSO`>29PlyJ|}+z+t&K{ Dtb=90 literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/12/f05030cdedb3ef85a9873886c63161d120fdc2 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/12/f05030cdedb3ef85a9873886c63161d120fdc2 new file mode 100644 index 0000000000000000000000000000000000000000..7720838d13503c0ba926d11eda2fc4d699fafbbf GIT binary patch literal 1001 zcmVZcpn@n3u;9?Ic5FjFb4$t>}=Rz)Oxj+{`Ui|bOdHc}R=$--F2PbU)uhhJ)U!nG`^akxUP$32m?&;Vy( z@}MifnYj=-tY^h^LK<1I`im!CxSt3<*qegUO3AK$UlqVE*R29kmWnoPE7c}1YuQz~ zrcGNjf}xZ2wDeGyq!= za6?ysskozx;Qi7f7Xb5=@XikGE2c}uTPt_*jx`d+j4!1^b4MNhY8expn%Yn;RZJMr z^l7~oQkqn!F`=wY234aBQ<*>aNTIz%uX3o?{Fl$~uis_!zka@*|M}rls?UTdRzv;V zvs-G`xIpClEJL-Fo32IvY_wFeL5j6fb0gIbWtlAvkkT`9y0lDG&=R{FD(H$ek!r=l z51eVs-AWiu-TG-YTuB_r0VgE2kfuNDPli~>dVpK3i4%&(;xxOK6|HOtc3&3zgy>Sj zE^k_?AWMGbSV6i|S~mR$#FLE!iELpgI1`$|3lwKazUX)jjUzi%vfsk2Dcq<5<^7x) zx3Lv=NAGEDhvGbcL-4_lHA$uGP5)4gi7hYJgNhk7cU6$UhqZ(4s=Tc`XuFVgzX%zJ z3ey|jBG9OoJM_Y=xkm7J*J*<&G7SE~km+jn($|`mKFPY9UN+s}o%xeT@?A=?Qr6Cmz_O1 zJi>A=aXgM-Yvk39N4VvLFhLhJtHM-_D`(ofyD3iaA?!V^0gHy$P*+mei+GI2P4fFm zJo*DqAhM*jhWUOvlZ2R0P?+~0ZR4Qxu>TGPo6!- z$1mjPiVPNYB}aA;V|3}@Rnd-RvGPMeCJiUUg7 zYQKHeAG}}_OViMmTvBB`HBP~Xc2ww6k-EuL?MYXZnX9_gvdR=Kw4aB2S}Tl%-nTZ) z)JtraI8ZOi6q_4K`W7_t-`xA!{kp%uSS*ALkcF|c{W3b__D@I0Cuif6$AH})dsmgp zIkM_=qb*#XE=ksamB}f-W}oUuLmonJR0nRh1VfH!5qqv2JZ1L2}~QRE3_6m4yc@3kbN7rj}*Y zme7?~mNnM`7^?4~!(FW>Y%sojsX(LJ^>(71zvqx`s!CaL(Nvd+ z*xCa&>uL+)3oEbG!q`uYTdbdk`L#wGZrQx=gllT1TntV94t#DSzk6V+WaUI5Gw`_- zvOuq{UW|heFR}g=0eA1tO4H2T=^^&Atni)Fz zOqA+cmE7pQswY8%hm(up@kyU<2fd^10QTx;3b!I)8haFdSwg1AAvHJBh`D$4rPoW4 z?AK5YwR}PeU}0CPgRoLf=2pqPdyx)=3LQqJ*g+h84sm-tIXXw+tj-l|b@zq~ZBuo7 z5|oH=8MZ{@!j($Z>C=OQgHy~zSWj-lCu&+Yr!Mx$)=mcQO2I7jR5buUA1-uT=sI@G$Lw2ct`ct}-KmhJuRDhtqo2ZoP}!WArq zmGMAByZO|}+<^~2w`SpxG2C<6DUQK9Bh&ucmz`n9z{HcIBqYYol2T{zj3Esy4}$iS zq-%CUJA6gsxLKyHS_T2|@O!H`N%UC^p@)=y_n85uY1^I$ok#~Eyke$&c!O~z9egws*A9WDhM6F4pLwkw8BIwerq+)vW9r%peN!d@#KJg+HDb2 zdpiQ+AV}N2bHM&G#Kf}JHn7J--NL=Za-bup8~1Uc#$P|!Tl*V1=Hyi+ejYI+2<5k2 z-|(0RbjO18}h!s9s2+O=uG&k z6{laA7;f)eahfs@6{XOiEjZhSavh0XBO0|c97|`{o_hts0Ft#Twj_mwW3#I{Fv5ss n^5k)7iqXEP)GK*9VNqKiCCL!CoWzU}=3AKsY(X#ztW literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/14/20c135339b445809162b38a692ef99941f1d95 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/14/20c135339b445809162b38a692ef99941f1d95 new file mode 100644 index 0000000000000000000000000000000000000000..aeec93682af902930c90ed82d92dcf9e870212d4 GIT binary patch literal 46 zcmb)ODk>y?*|tQD%w<&OM5KFTL=-AOqJt{>=b( CL=lVt literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/14/3d12d86aa3a2b7f831a0430ce4de8b28d82a51 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/14/3d12d86aa3a2b7f831a0430ce4de8b28d82a51 new file mode 100644 index 00000000..9b76a070 --- /dev/null +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/14/3d12d86aa3a2b7f831a0430ce4de8b28d82a51 @@ -0,0 +1,3 @@ +x¥Sßo›0Þ+ü'žÒ*…¶“¦mÕ¤fi¶¢¶‰ÒU}4p€Wc3Û„DSÿ÷ ÙšIÝËò€â³ïó÷㜠+•ÂÙÙûwo¢cŽaªš­æeeáüôìí }>€­¹dXk+¥i=ü3!µ¹Î[ž¡4˜C+sÔ}Ó¤aõ;cø†Úp%á<<…‘C †­àèÂAlU 5Û‚TZƒ„Á \ à&ÃÆ—©ºœÉ ¡ã¶êïPx0TjgÔÐlA/³ip¿ÊÚÆ|Œ¢®ëBÖS•.#±d¢Ûx:›'³¢=´ÝKÆ€Æ-×$9ÝkˆVÆR"+X×ûSj¤=«íNsËe9£ +Û1ŽkÎÕ?fkb!0_P$FBbrb CI}w`z literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/14/ce2ad4026861d89bee5f3555abbd1026726394 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/14/ce2ad4026861d89bee5f3555abbd1026726394 new file mode 100644 index 0000000000000000000000000000000000000000..eba8eedf10c86eb1d408e5f65a63e26f6b7afd71 GIT binary patch literal 47 zcmV+~0MP$<0V^p=O;s>9WH2!R0)>>++!ua`}H_m={*0^yfY|6%hJ^N;E0{{!Y F5UkRE6!icA literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/15/7e0f2dba5866e09dc01971fa0f13253d55d31e b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/15/7e0f2dba5866e09dc01971fa0f13253d55d31e new file mode 100644 index 0000000000000000000000000000000000000000..e6b99ccbca05061bc6ec3274780a752ac44f7875 GIT binary patch literal 76 zcmV-S0JHyi0R_QP3Vgf0V^p=O;s>6XD~4U0)?!^vP6c04wVx%Cky0cPpm(Zdy{u=a-mujM7k)o lIKQ+gIklL?{5iE1n=CN4{R#v=R;w6*YwllcGFTXS0}V%$<9;#z9s7 zd-sf$;6|!c9)P>snVXqiJI+iD=a*Mk@A@YJoWRiJd#ln7!NuA6y*)OA8(3qevX z8vJKNl)Df8ep!}6R+5FWX+Jv{a{ar>a6FC1r!2dM-RlgU1B<^3W!ZAP2br_1M8+&O zlVz1pYLU;#c-f^@q;%Q?XVz3oi(czWIkGA)sF7Oj2H5*?0p}()w8ID{Q5$Z;XcF~2 z$#SyzJiA}OGMvxD>0&aDU^a*0Y&x1OCbKE8ZXujLz?aE%)C1(qxI6fiTkn9|sC=Hd zs=|xVhyKzrSo67GyBrg>Rta0vX(3aD)a=k|b_6-vt#ZDvjs>o~q)crUNvgJ9r{Sne z{UG3+A3f0ux8^zsScS2~dQ$PT(2B$Y9bLcOwuRPc#k|lWQeUP zVJ)|yjfc`9VJHWw$`SBqjD-iKAvWtGS5n6amGY}PPm97#;IhRqk(YE`Qb4f8uaVq`s0CnQNk)w<;?A4b|FefNH;ffpn7^x}y-LVHe(w z!fDuNkc;X0hsCFJxEL*$qxt!C62f8$|sp`6Yau&QJS*q#1Pwe-@T2 zpf)Pj6O&rJ5Lxtn#~`J1Ub_Ngm8zIZ(^)Aqgv@NvYN`kdv}@(KuZ{>NOet4u<)yE; zuH0~~OM@UFoxd|sf@?Dj0%BpThi`HtMd?*8W~9y4KJ{bQ8Zy9|a*5nz#@^WNO;lG{LP@P$V`c1j5uqgTw7DvzCNI{Nh*9ZH#ofM+|sQ$-F=Pg zlLvX+12NJ34sHPjgTs1KoU}6}ERdeDh4(6o*fzWUQ@KG1w`gf|5S-juS#WY^lAtIf zdWI0^lH477>VnLT#-^5Q%G9>UHI?pY=Ka+!_!R^lYRE=<@;>)J2C^Bj<%sVaUbJQs z8G2gv9!NzJ6B(LtLFZ&|qAUErWFqR^5Wd~k(h}GhmC$rlnsTvazkCI0Gj~8_JDpqh z5w_%u_txK#>NgO>p!1vAEyw^?CAd#r=WLKTr4XXc=~vcN4kq@hQv67dmN)6VlXiP0)^bf%shsO>HfS^7pyvRv*5=?$5}mBr6jldL8MDk gi%S@`G5s=-zZ=%kCLs87$Nvo>ZpTzI0FM3}*P>J*!vFvP literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/19/c8b00f48088aff03daaeab108c0ae1f3618d98 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/19/c8b00f48088aff03daaeab108c0ae1f3618d98 new file mode 100644 index 0000000000000000000000000000000000000000..5baf5a38921b577333000cfb5da31a79bccbc97f GIT binary patch literal 46 zcmbZ*$K^lINu)G6Hk`=a*B{|t=L{96E; C_!El& literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/1b/20a03ec26b82231e95d09e4da5e275320701dd b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/1b/20a03ec26b82231e95d09e4da5e275320701dd new file mode 100644 index 0000000000000000000000000000000000000000..7ed05a7c328d35624b86217e8cb0ef0720b02874 GIT binary patch literal 651 zcmV;60(AX&0qs>$Z__Xk=5_fMr#^L4=WYWu!GyG|Eh1vHsOhM9LQZl?%@RA<&aw*a zzjJmoSQtDY@wh%z@!8+y`@TD0l2Rpbe0qBNY1#@WyVGrgisZ7{MI!QluyiX3)qCwFiYYPYK)YjNlV$Bb0;_b_7G0b@HWNTf{>7^sxAeWDMBmk#=ob_;+VkaE{94ir{kOe^%hkA z@E~y8kp}nMSX-Od<8j-zjC;yV>0(^&1ex(=G?~rg*&)&HU{|t4V?g7#Mre|pY=PHA zE9D81EqUwxDKyfaRgQM6g%z?Gfl;|_xkkq|6UJ(hG`8njrv^y-!vo|SmoNxph~fcU zgmDy)T#|LPdbhY*!8%+n!}%(j#jseyWHFyct7tK&)msSXpW%HppN;^@GpY{W*4inc zG79G>X5PFQo#{U-2087!wW%=`xkyQxEE--Q6zT@GBt=l8u7q)QHAFCTluA(v%dHRn z>V^kZ8VAAO+U=Ep;ZwUkwcCGfH@eo>u5UA})L9Tv(<^PM{R{TBk;1YS8hiFQtQ#p& zvt=XKbaDDXQ)}w~T=NQBrLS3{lx3FkuvAHlx0c2J#0AA4rTW{2)(E8oq5rzAPdL|a^So(W4Kedi?g)k#_R{@yWqX# zVcTO3Z=f%O(ZrfAK79GOSgr`%CmPgELL(J?YFLUSQF4koZ%Rv2a#4i4k?ZD+^Vh)l lAlN&1kHKDty-^~gFMuz{rQ(?x?$fEgyCAp=egK-oUWzr^L+=0p literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/1b/8c8fa0ac1d68b2e286e21073445696555456a8 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/1b/8c8fa0ac1d68b2e286e21073445696555456a8 new file mode 100644 index 0000000000000000000000000000000000000000..59390d3bd3b8f96a707b7dbff92372e7e23a217f GIT binary patch literal 102 zcmV-s0Ga=I0V^p=O;xZoW-v4`Ff%bx@Te> ‘»'ƒ–…ˆ: CÙ»ÀJ.¯ªJr»ÝDBØ!e¸vûÂ"oÉ|µ‰Ú%ä—’ó§Õj.¶?`d‚.ÔJúé–èõ(˜‰Q£ñ5LÄRÖ¸…–øÍÙd°aöQ•e›úÔ옉‹WGN5.²º]ÞTe®—IÃØÈ`5fBˆøŒ@kËIs8_P;[G%«Ë1“=2ÔÀð>Ã~hÖi‚Ù±Óà‹_Q'•wS'w9î? CÌýÿ¥3ì~1$ß÷½HÚÚ;c9V¦iÒNF›haC˜ qh1ýĦåڦŞWâ&##ÚhØt)Ø-PÄo帠 \ No newline at end of file diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/1c/f8cc93f14e4ec7b3e6d2566653c1073f0a915f b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/1c/f8cc93f14e4ec7b3e6d2566653c1073f0a915f new file mode 100644 index 0000000000000000000000000000000000000000..989e08afdd9a2c0bfcd11b3d614766600cf2a567 GIT binary patch literal 77 zcmV-T0J8sh0V^p=O;s>6U@$Z=Ff%bx2rfy?OG(Vh&r5aA$xO{FaV#jv$xKcx$;{8w j%StRuWRR?UA*p^?bn}L9mTJ}7Q@rPW|9=<&6^I&Go2?;| literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/1e/120f6fdc27b578aafd3db30500b1a0bea0d9e5 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/1e/120f6fdc27b578aafd3db30500b1a0bea0d9e5 new file mode 100644 index 0000000000000000000000000000000000000000..d7139f7bc814026bc60b6dd74f30ba7eaa1f4935 GIT binary patch literal 1173 zcmV;G1Zw+u0i9M|ZyPrd?5p%E7J8Bcg-YEoBxwQ5U#U>rDkP;wP!t94ZY8m~Bd;XS zvQYTHcgQcQ3>xyzZI*`<=)By{}U>ui|6K>69@~DS1M)gIHO8uY-7-z<2)+wXuSiGWs$l7a` zdPi?VijAqLkQ>s*Q{@;rl%s{pnfN~C(v#AZnxf2=)G5z&FtbOU^ij!bE(c&S@^ZI9I$4}d8?Aj?^Uf~L*U-tfVxRd zz0r)uvmTv}X5-l)B)J{Wf1JFZ)9q+F9o@{w7c-hn>1=XyKAw*!H+Z_F(ai_?X?$}& zAV$rg4&RqHFo29I)RVJVycvh0KPpBGtcPb;a;g?81vR~_3~N0G49PAp{Vjok>TVXFvAj4E%|LAbpGo`f6Y#VqC=)#3(5pASKY znAGTnT2_|Dg$|wwC!RI$B8JbW@hE^m9?$n%7^gt=q%P0GJ`gN!Il0hx${Jm;-mmee zxzgNJnJ^{m1*@fQ$Xtf+XE2TS?jVm(!&`xe;~Lg2$xfl=e~tO~1&`%wop!FQSL~1= zRR7?)dzFsX{kky?JPNBG3|@005~Z`YIj0yZkp3D21#bS|;fyg2e{Va;1?#7+{u(*Q z)(aW`&27clI~&j zSETFrzF+ww?;YV1?mUFlE#&<>nOBUO@9Nzf&_d>Uf&q^Am(AB5$gSR6Y>o94ddXrK zKSwJRpmVbC{N2ezoLEFZYRjWh=)e}rxH90v{R+AL&vhOtR~ItXQb-~3miP7@!{402eQ^XcNv2sdxd-kcK9vA n;Z}0bc)vEu1aro!jCb_+#gC@nvg~bf_O`r$;-ULD=v&)sI&E4Z literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/1e/2fae7bc4a81cc3b0c2bf94ea6b7a1497083645 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/1e/2fae7bc4a81cc3b0c2bf94ea6b7a1497083645 new file mode 100644 index 0000000000000000000000000000000000000000..ac539ba4f22f05786e9ea13f3810365a258ca706 GIT binary patch literal 79 zcmV-V0I>gf0V^p=O;s>6XD~4U0)?!^vP6bJ2MM=j=hYjQYG390V=K4TFz#?5M7k)o lIKQ+gIklL9WH2!R0)>>++zWcorZx50QkBM EJ*`y~hyVZp literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/20/b325dcc7a5a9eb5610fc1587bfcac9313ff1c1 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/20/b325dcc7a5a9eb5610fc1587bfcac9313ff1c1 new file mode 100644 index 0000000000000000000000000000000000000000..4a3b9b355e4c126d0ef5eccfeb41f7fbeb10f354 GIT binary patch literal 1158 zcmV;11bO>-0hLx!Q{y%e?yLPPws|>+;hZZseYnzg5(2cD($FEf(rc#=vaKX4j^s)* zPOig$?G8wbyR- z`o}KBR@Jm-TawCBZ8%~GLkm%I;+vdTmV~5St*cTnnR9A{UHNm`C=LmIYGbI(GMF zl(Q|d3b1mP0c^<{&(BhG>{;btH(FRBmxpB3!Zu8EhqVyKYLV6U5o>KWgxtFZ;EhS@ zjb=2N_2^_Yo6HVfkn73($IFj%x*lC!ji&R-*^Dl)XnZ+6oy;efQ+%D%X!?nMnoLg* ziGwp#hi@wFGC&!H>b<4FxMpSXV7RJ@p z0AS%Dm0~R{vwrD84V@|t;ut*NxIhJ8tK&EZ3Z*Um#ctUqWfBVT{^>8u*fBy|UFY_} z4k}0`w~JD2(o(S^V?dU3ozA!hu;cr9FW6n6059AAt|TA1nqAO|@c^lva zv0fD|mh0WX5oVyU8q>m8whhAdWuctqW4J+`6t~>J0tQCuBmvTyutY6F$(k zLTTO@+Cy>*D>PmQAY@_aJNgHUQS=yW8nzRQEMfAHa(Z?4!`W|#R51$@B=&mgL8}Iz zP_IvS{WuJaE?qnD0{7)W$e*{TVWS&3^%V6Ts~zjOsxx%yz+ant z>m2Ml7X_Kd(QtQP;|SOB7ToP)3IUzAcjAmASLq0?a9A-k1!8)M0=P0qEd=8lTu!%2 z6qtEJCNqozx%}f#Z`=1gKj{E&${=IOn-)a}Z+knPaH1$s@qekcEjl7e7GxkBRG6cqr+KU`5AZ3{G2jLua5S}qEct2<=@@#nt?FdVHjaC@t YAvnf2ptw3X%n_vE)NmL73ueWOc<`V?8~^|S literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/22/ee771cad7c4b0f17d9b038c3d7aa6a9aebc15e b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/22/ee771cad7c4b0f17d9b038c3d7aa6a9aebc15e new file mode 100644 index 0000000000000000000000000000000000000000..a06475c9f480cf85b1d94cefed1b9a3b67be878f GIT binary patch literal 929 zcmV;S177@i0nJriZ__Xo<+c44rs4q}5^seEn7kmqnY6(~H^i%(xUIJ&wrpozh4}AW z+i~i&+0-|XDmA`7*S_c656??6N7Fac=@atyzADijQ<{tVbaI>?O%SVdQSf?sI=R03 zoV=dA&BjD3al>+h0A1^od(BTLD`Vsd#_RPuUB66)TH@)^(J}sYaX!metfC38wV`#+ zCf=*_sOTN5Qz|LIoZsd53;ZfQg1g6~5rV@{v^(Kk8eToIS|BF1#^u zSER6>WaAO3M8V3Ro_OZA2=3X&09q>1$g?5?cBz&ML|G_Wv9(aQXm3zhl?5HUA+v000XD-qIz+l-*E8 z@OEh(L#v|DJF&HMyL%+5?dM|rDx=Hk*qGDB{mndrb|`@ss(E|IMbH9l`ufv z`f)W}N%Z7^6QWv()1P!F!(F?2fLo}E1B%ARX*QB&Qd9)HFB|)a=v;u6S5hd*l3zJi zknWh4O@EJgWavp`3q!$~&Ztzb0$piWJ6QogYIQpA`HQbvS)xa!r zpFXX49}6P8_?;t(z8^2xz4q-#-m2&t*t2*b{P_CtZKWi*6&OBuN-Q#LeAHozJUEy8 zofS(Qr@I?9UZq{BkT4#F@D06^xxqEdGkDyIB^i2-;(?7B1}i7VSd@Ou^p7N%PcvtWNX z?svx2H2E7OHeV;8oVfaz(;Old?*61m#Aa7{aJ^{?tNUhQ9QhT?mKjJ&w}^lyM5&OI X`FXjpK3OgNrlFr1+dX^$^`HM{lNoU%nvk9&3Tt%vi4E_2eR-P7sr&s<>QUPk#RR zl3h;T6=R}}x@V(E!>W* zBzkooHC;2AQ%%7v_}zWK#c%T|BF{N-hK?xMv4mZ4Zin3}bS`%T@m2=hvH0+3efu20S}cDzjnqhcI0S&X|!&W@eeIgIEDW=6y?0YkH9chs$Lfym1&Lqe&C zMxz)TEsUy>VOm-4l-Z&z^YZ{CMnr)Z&141lV0%j?U9vhstyp`&nf2H`g~>FmPqPu` zU_b{%=#9Z(T)N1RYo8BrOVe=9y!b-hRR{<9EyN}EF ze}KHVG2qBghJl!H1tLR9Ir4eK1zZ=^n38>N6{ZLR1Jp-#Id0=e?4GV^o)BN;mjn-X zLi>7YVI9(i@zkP$o6@!`F4|VXXxIm?5nvN)i(a`Ew+R038|x57j=?{WghsHx;*faC zdhH5YlSS_=Mn2N0Qpp8hHYP|}%nZas-olv%lp}n`cHl!>AScux97*r{^rRi!yJ6++ zpoNkTeB%KRZwHG$6 zf@$X-YzZEgy@PdtqUHklQ__q3F&MYK^RsYt0nY%kpu&RmoR6djEHqW{t}n%Wk1 vq}x7#-BEiS_479GSn>Nn4-j>{|EY~Uf+|UQ*Qa<5$FLut;$r+8-%JWh$FIy& literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/24/60f1beed2a074726a8a0e946387f8ca0c662c8 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/24/60f1beed2a074726a8a0e946387f8ca0c662c8 new file mode 100644 index 0000000000000000000000000000000000000000..657faa9130207cb7932fa6cd6447132f595359ca GIT binary patch literal 80 zcmV-W0I&ae0V^p=O;s>6XD~4U0)?!^vP6cXH~hF11a=tCtedOzH+brl>5G@QL!^sR mi}Op1l2eNr9ICIK(nwuZb?KI-xk9sg@9U4-rvm`}ydF!4K_-6y literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/24/cd2a2c1086906a2e399bbec584e1c93df1f4f9 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/24/cd2a2c1086906a2e399bbec584e1c93df1f4f9 new file mode 100644 index 0000000000000000000000000000000000000000..d89f6dad7c7c2d779d803c412916001a19f7716a GIT binary patch literal 66 zcmV-I0KNZs0V^p=O;s>8U@$Z=Ff%bxNGvGG$xKcx$;{8wD=5k@NG&SKOf6;*t>f3- Y6_NH}?g7cdU;M(VwxO5h05Jd*W-W^w!~g&Q literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/24/d788c5943f09a1bbd8af6010636cb6f8b422f9 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/24/d788c5943f09a1bbd8af6010636cb6f8b422f9 new file mode 100644 index 0000000000000000000000000000000000000000..48fb063eb29774117cc5488780d3b383df4a5ecb GIT binary patch literal 929 zcmV;S177@i0nJriZ`(E$?W_GOSfdZygG47AhBjbS^m_%8HK^O6ue3zlOeB&ZsW`^4 z|GrC7lqp*Y{I&uHERyG5-gE8;m$h7?^H=jfo{`rNO^xoEHe8C!*;ziHAtp*$ak0Lf zegF0`dpUbuOo`I+mX#I(T9}Im!!KtWYt;qD+wC^r{+3I<#^>|-8UAs7wJ0~Np&1v( zQc<#5u<9)ude1~o6$O~LyZLgBf6wP|_jEEr;QYdP4_C6J*2mS|^|&Q+2m|39K^{yM zHZy-k4(nMlosdRWto}O?FZ>a~gS{z$)>^jeb5#Jl+$asAtTb)dR_eRFtYur}hBm5Z z1VW$gPlzcc?D9rQ4Ot2+&kE9= z(sJn^5KlG+61l?A;1h~J2oz^VzHE67jUroJvJc&CDg0;w<-=SV$G8f+rS~+pL2;J9 zBzUmnAgOdc^pj>xY{N9ix-%l6pQTq-f?^N^+99TROetLcUc2W}D2@IbHC6;XLLez1(K01eo zos~+Qrn?_CL8U{f)6#bL?&CTkjAOk^-d`77edKKPlXV9HViaoS(#_cX$Gk6|D_4-swydVj)3Y zBYur;E@-W5FL1Jz~`B{<9`>gjF15eV#%aPGLVhXvOqD?@i0F DMB>SE literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/25/1bf5f968833778852f4975ed010b2ce64c2cc7 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/25/1bf5f968833778852f4975ed010b2ce64c2cc7 new file mode 100644 index 0000000000000000000000000000000000000000..3a33aea6f49da05f9ccdc6509294dabc43e44608 GIT binary patch literal 1025 zcmV+c1pfPY0o7JbkJ~m7?bZGjtkFYzpy=HcXt3ZaNSn3^u-h!+q{x+)Xq#(FBuHw# zM$!M?At}m|KT;nr3J!9C~CL;ggpZ?CQo&J}SWB|6n z-ap8fUwZuau^+de%bYPbaT zJn%c_RwPICdyJ7(YTalQeWQg@6*62aE1WW0gs~R}Fc}dAUNo;uD2VMXtJ#uQ32MpP z1;MSy?kP;BVff*=NTfQOzG`q{^wXE6by0kM1ev=)BHJ$qoOe)5a#DJ6rM;56tv7HMbtr{TQb zh+=i1v3_nk^Prm^;J$Ve108kSsF+j?C!5PqASd;aDyC5NLM-FuShHwqWz^nUT4+owh* z6p>*qu2yq=9|!K8&`ejZTpHsH*jg7l_aJqu9l?2Np8G=^TDqV#C2uQ%z@k_5RoeUQa2 v`^S?w`&wjq497m^18|*~z5$7T62Pxmu1D~sE;8WiT`_Ff%bxa4juL%}#X7EGjN>EGWpyOinDx%+J%yN-Rrc eXy|x%_^p(~scx^=Cp+#tp8Pt)t`h*j&>Bn4XddDK literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/25/7953d389fc8451520f2f71552fb4476277291b b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/25/7953d389fc8451520f2f71552fb4476277291b new file mode 100644 index 0000000000000000000000000000000000000000..1eedbe544edefde1eb4e4e3313e4a4e6d86112d1 GIT binary patch literal 82 zcmV-Y0ImOc0V^p=O;s>6WiT`_Ff%bxD9F#%tH{k^P`Tc5bc#La!reF4CkQ0xZ2PfA o>8FVS5GWKEB{O8+Xk6rV=!Ja2oXXN|yy^SyXbQXp0OLL#%&*NRIsgCw literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/25/97222b8c3d4b2c49c7fc3e5288da62574320c9 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/25/97222b8c3d4b2c49c7fc3e5288da62574320c9 new file mode 100644 index 0000000000000000000000000000000000000000..63a854aea6111d2ffd24c8255bf534ea4a7e2be3 GIT binary patch literal 46 zcmV+}0MY+=0V^p=O;s>9WH2!R0)?!^vP1?$gYwt5L3h2h-|*(_Jg6lt`cO&+0Pb@P E-=3!w0{{R3 literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/26/010ebd861c7280a21e27fcf77164624d5bd15d b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/26/010ebd861c7280a21e27fcf77164624d5bd15d new file mode 100644 index 0000000000000000000000000000000000000000..02b44f741685b196dd8d2e0ddedf10e9e49e3243 GIT binary patch literal 823 zcmV-71IYY%0hLuvZ`(K!-K+E~20qz^OQ+pMyKOE}?JQPk-~f@kL65XFlG(_lmK;Sf z7X9x#q?Fi>n*!BAALM+zd2cvc*JcfG-v9aTx7n*0UcuZnJFBV zL+nfoTe$;m2wI06Lpdl_jerk1HUvsTZnjOWq|OmKMVpXkh~kmJ*CB>klVo$r4$Tfs zd1wfd2GHQI4N>Dh&SqWL2^k;@W2;%+7vyGF>HKn;UA|`6gWDHfqjO;K-&R>JdA$SK zFsxjz8Eh@Pz)xk7_sDqIomHfCH3er%>ZC=FwNQ?%TDNq>+E5K}?S}@;o76B$GDx!# zd`hx3oBANP>FV$6FDtlBZf=t0D!t6$`Ud9L%SF0Mub2Gw7bMHC@Ht&Brhv>DtAh`X z^%by;%JYduATL8t`jcW%^1lCe4d$v;IhUrZR#pg=xkszHB52TVmGinf23UAVwc09@ z6qfegaG=sGj+y5>AE>~sIgevTVJtD8N_=azBC$e8=cmiI)f%n1Y4t5va_s0D%YaHN zx7ZnbC)Oyn6Q#__*qxA?+bVz(NlT{l!W|_zaW{qpF$|F#P53|}3kg2)`U$${&UtOx zLgdV>Cc!f1p0Ax)Jig7t&QJ5d5W*h-;}oHoKfe8XRE<>D>Oo*@@lJ}%@c5N5ftLeH z7s`@CH}9GHXy;lgMdBP<5;8niwnetR7B`8$jVBy5`tIYN8a@k`x*k^V6YXgjkDgij;n7*c$CGvqj;3+M z*NKg0f_aegaD1ticrHhWc|x4gQw#3vWeR<(gWH(4E?^_?k!NoY_i-=G>ka>0cmVPE z;on7poPIzz9=`};pQfjEA}XZCG1W|D02f7mb9^@8sryvk5BuBK#=L)z{|9Oxcw57K Bo(li~ literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/26/914b5d4da8bc81fe4d5dc108190d959994824c b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/26/914b5d4da8bc81fe4d5dc108190d959994824c new file mode 100644 index 00000000..ca856deb --- /dev/null +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/26/914b5d4da8bc81fe4d5dc108190d959994824c @@ -0,0 +1,5 @@ +x}TMoÚ@íÿŠ'‘…|Úæ!T±A…I£{l¶1»Îî8Uùï5n‚›¨> öãÍ{oÞØ«Ü¬àôüâüÓà8€c˜˜bgU¶&8žžŸðÏ 5‚áM¥e²¤µ±¼nþ9Á0¼U1j‡ ”:A[ƒÆ…ŒÛœôá'Z§Œ†31„ž¯ÚmŽºG—¾ÄΔ°‘;І tÈ5”ƒT帱 Pb³)r%uŒP)Z× ÷ŒÓÁma½ŽQù~bR7/Bßô×Ä ås¿vÆ*U1[ÓY)3„Ì<£Õì +´å|®Ž&^R®6Š$Õ[oÓpÒ ¸Ï¾P‚s¬ÂXòé +”æjËQJ§FLK‹2ÔŽ|ê£S•]þpPâW©‰%:ú`Û–Z£‹Rß³õ7&t…e©•¬Œ}+”Ú‰TÆdìNHÍsX»ã’Lå“n¼ƒC‚X†ˆ&Ü’ˆj‚+Þ§î_p; ¼V–:¶ë+ý—·EY7ã¢af×lžMÿ½½¢ý¾ˆséÜQ0jË Fmî (W<ÚP߆H%K;Þ»ÏØ[sð;:£×>Rã¡"C<:è4ÏF%<µå[#×;âÂ_ûýÅvµÉͲcúÁ“´vØZš>•2w½.Ö“ôªÂ3ñ,ÁZ:~?ŸeFvûðy8öƒ?m +‘!ÍŒŽ0æB{þpyy/ÁWÖÓ_ \ No newline at end of file diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/27/05064df8cd6bb37bd69acc6e7033fc2bd5d80e b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/27/05064df8cd6bb37bd69acc6e7033fc2bd5d80e new file mode 100644 index 00000000..babe20ae --- /dev/null +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/27/05064df8cd6bb37bd69acc6e7033fc2bd5d80e @@ -0,0 +1 @@ +xm‘Ánà †wÎSì\­Ë´”ãºi0íHâ*ÁÈ@²íéMs ,ÿþ?[vo±|n»‡àÉ8Ť÷Ö 2tÌÉ ÄoJÖ~ÿ4hb)ŠÓ©m›"1£ŒG/crAðÉ„Q«L˜"&ÇÉ8–k´à·˜ÿ$²â‚´H¯t…8Þý%ÜÛorå.™ŠÐË £½¿ˆÅ®cô‚s‹ƒ´C/ùU¥·1ô’¥‘×À•‰:õlÀià‚‰f†£9ñ ñxF¼xZ¿Ê’̽çni9¿5¬†îÚ®m,*U.jaË[O|¡|ÖéÊèÅÛûë×Ǥ»Ó \ No newline at end of file diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/27/f3a58a7573fb5326d07fd419a444101b92b864 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/27/f3a58a7573fb5326d07fd419a444101b92b864 new file mode 100644 index 0000000000000000000000000000000000000000..678ac04abf6055549828440db0a93c9cc144ad29 GIT binary patch literal 74 zcmV-Q0JZ;k0V^p=O;s>6VlXiP0)^bf%sdA3j}pfv{E}t_?wBN2uH|~_$VHJFh;&J6 gaS6jdlWn5f>2nu7b@?n6XD~4U0)?!^vP6azD`sc!eI}eN`T65D)fGRVeS5j;3`Dvp nwK%`DC^@y5;mOsblJV=gE^l9$G;QaHc?t8UKDz|~u3#gReElUh literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/28/96b7f081b5147763ebbf2a0fdba61dc8636317 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/28/96b7f081b5147763ebbf2a0fdba61dc8636317 new file mode 100644 index 0000000000000000000000000000000000000000..799076f0295750bfc61150acf021acd75bb2497c GIT binary patch literal 105 zcmV-v0G9uF0V^p=O;s>7Fk>(@FfcPQQE)9SO3h9TPAw`+EpjX<$jMAjEXmBz)5}UM zOJtbOdt!S2S>>waCGI;9Bz!xRv6}NZR9|prZb42eh7RlXN7CH1=5xh}o}6sO7GIN{ LdtnIxcPlH?M<^_q literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/29/b76ab14c1aa22b2a4dea14ad58c91e20d8f817 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/29/b76ab14c1aa22b2a4dea14ad58c91e20d8f817 new file mode 100644 index 0000000000000000000000000000000000000000..d90a53277592d13e4bb23b6724a691694f7f5d0b GIT binary patch literal 79 zcmb6VlXiP0)^bf%sdA1KddTC%%3#${EYds=k1RJ$2_}yA<`wO g#U%`n&W4CgFEKZHyZp)mGtQIjpSpAM0lVTIS+%Gm9{>OV literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2a/89d4de6653c81c21ab213f9c97da05c24cda80 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2a/89d4de6653c81c21ab213f9c97da05c24cda80 new file mode 100644 index 0000000000000000000000000000000000000000..9e839d71bf8f8f136b16ede912af4617fd0cbaee GIT binary patch literal 46 zcmV+}0MY+=0V^p=O;s>9WH2!R0)>>++_i^z%Eu`PrqgwBUp6_FNO=0S|l+ EFrthU6951J literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2a/af0a96ead26ce1615fb768875d9941b149f2fa b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2a/af0a96ead26ce1615fb768875d9941b149f2fa new file mode 100644 index 0000000000000000000000000000000000000000..9ebed07d44283db9e6308834ea545f589cbd3651 GIT binary patch literal 96 zcmV-m0H6PO0R_P^4#F@D1yJUmf(z7wEy~8o0C)HeUo;|dEXU>ieQ#@HyQXxR^gmr} zc;s|T_hp(_{R+%lEr>c)6rFj*PG5L9e~_v(poP*I_#m)$n3Q(Rpy$`)`91-63nIcu C*DeA8 literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2b/17d9d304d10eaf8ab29f0cd9c4b6ad7a47594a b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2b/17d9d304d10eaf8ab29f0cd9c4b6ad7a47594a new file mode 100644 index 0000000000000000000000000000000000000000..6b71bcfa865334ef0b3e9a9c9c905c080c57d9ff GIT binary patch literal 46 zcmV+}0MY+=0V^p=O;s>9WH2!R0)?!^vP6b?lbaR)ov{<0V;ov9TeRk}?(~=30Q+AK ER*;bs(f|Me literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2b/2235bce7e286b5aada0dbb6bb23da5f8cb3375 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2b/2235bce7e286b5aada0dbb6bb23da5f8cb3375 new file mode 100644 index 0000000000000000000000000000000000000000..ced7b03bc3c2ff5cfdbdb7ef9a5c3c0c084082f6 GIT binary patch literal 809 zcmV+^1J?X_0fkiGZ`v>r-YfYlPCP+HP1|jnx~dWsm=>*tiljq*nw)S1uZf-74gppD z-**mCN7||50VTHY%lG4aQK}+1{ru(pL;uKwBN(ZCr$w^1aCUO~@tFS3!LAV$Eegp~ z;Duc)P4D%SVN~WSuSJZ~;1UYCL|qjPa~@M|z0-rAsEtq(&e#cb9BRAXYIiRj#7-5E z@f}EIp)g1o!oW(T2)K#{qUqA{THu@IUhM?2s-(TaIQ zWK&*N{v;Y{&nic|)WQmx^uVZJhn>j7?;#m6)83>tSVh_jSsvjSIRPKcNHtS5=o(vl^C%AHA%nKiiBH%=KmO$ zq%Z=pxV0>(NL~^48-@QQ@J=yXU^I~%p_R-~Hr;xSRlyusFcua0(Vo@28X63$a6Z*4 zCnu*WFX}*X?W`QgM^0mlqLTGpL}! zxkxvN=OgN1X@~nO==#oiYv9TAT7#Fcy%t%&;TGX_gkY*nNl0tpD(U3@GaDtAG(f84 zt`%RJPM7Y3R;7VSHIdvjd-7T>5=z|=uDR`;b(t`e$AYJ!q9G>?+oQ7tZK$%Cj&$Ag z4c~@qjTI=3zgDZ?hmh`CJxH7iw#!mC1|(9)(X`<-X)xw)H16|tT}7?QB(?md;dGO+ nNv3^()_#YWb0o!@*@2H^Ve*vkri9<=I+o9#_w4-vx&SWuh8d6r literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2b/301a415819e421e0679ca2448bd476ac801656 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2b/301a415819e421e0679ca2448bd476ac801656 new file mode 100644 index 00000000..3bc4afd8 --- /dev/null +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2b/301a415819e421e0679ca2448bd476ac801656 @@ -0,0 +1 @@ +x1Â0 E™9E%æ¦R²12C¸‘Ö•ãHÀé ˆ‘"&{xïÛßGöU»Û®(Kлa—uh Å€I?ãÐ[G#Ö?¡#H o°pe]ÂR:ñS'Áªs²Mƒ›çC<.™9Aöå=–ðpøo_8 Á¼ê0¹.m¿žÞT=|¾Ø'[gf0V^p=O;s>6XD~4U0)?!^vP6c}nTLD-EWUk7=f(Rn*8C!?`ONcHK%|RO li}Op1l2eNr3^?K(c)!2w&fDqXHJSbTCgFe6I{`h!9&gFqC>j6& literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2b/39bd0c6257a17a78afd9b35f84fd44298c227e b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2b/39bd0c6257a17a78afd9b35f84fd44298c227e new file mode 100644 index 0000000000000000000000000000000000000000..b423af53971feac87a38a07107883276a756527e GIT binary patch literal 108 zcmV-y0F(cC0V^p=O;s>7G+{6_FfcPQQSeC3$;o%l$xO{FaV#jv$xKcx$;{6SNi8lZ z*2_vPOJs0u@H|xbcD{w@jnCVXih7J0)@RR#>h;SHPffzEEBEM8{^;9}8CmXfX&f!x O8_=P&I}HHJh%Y@Ts53(V literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2c/0189ee09ae9cdf4db26cec9e3dfa27d9cb5e22 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2c/0189ee09ae9cdf4db26cec9e3dfa27d9cb5e22 new file mode 100644 index 0000000000000000000000000000000000000000..0df9acc6b1d4d4ad5134e009df9796f6b29e5094 GIT binary patch literal 1184 zcmV;R1Yi4j0i9M|bK*7>?Q8ri?(kB`5V6g6JJV)56Oxb(Z2}!2P4}rI8v$yJqiO; zMHY+N$dqIr7S`dq{^tdb@yT1ADC5`%o{mb59+&cm7`q;fmmG|V--??@O zIbM^@Kr4|k$fmL=^_e?`d%-g8!s(#RyiMNDLLr@Eu2b!U({UblRI8&Q#J;@&x=BNg z?wI=H23>T={c)Q?9{Q7;;r)ajx}#BdFzNTkG#t_8aB$V1^oIjnT~l}PiGJ-5uG*xa z8Qf7%nd1mxqh>wTv=ncwSo9aiXomZI?K73=nNARzndfq@Xl_@^8AL>xa!c*mR}X?y zrj+WX4ltxmm8y; z80F>xA?_mj%z^35$)zf+dla#?K?LB4#G0U01>n>bH~6|!D9h>Df7zbEZWF|1`NL;NNaIq}FF(tx zBu5snh2NprICk3L|nELl`<=_QUGM@J~!b9iYB)|)S@rCTef7ZQb^pi7}lR&bd1 zO|OvNmkirlsE!;dLRdYNzcp>z3u3n4Z%;<#G<2Z^s0Kc z>*YrJEs-6b92U+N9_)GQ!CzQ=RC)w_g2lh&Pz!@4b7;fZEpdf5t(Yc>)$#jLzuDks#B0`xv@!9f9^1kFc6xJ0S`l+R#Kl(~9BhYFRu zr4dKZToH91vn4w=;|*img@dxQ*b@v)^{vOl3;xHtLmJGwvOZ)2njVXf%3!#Y4&)a$ zPp32k^EP3+^Zb_tE4=2{gF>#$ll*p5$Byw^iO~FF@2mUC*}=RlF~z~u y_b||?C2UnihGfFp;gqzdiq+ha=r literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2c/cb490a582bc294ce60613169ee833a7b575701 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2c/cb490a582bc294ce60613169ee833a7b575701 new file mode 100644 index 0000000000000000000000000000000000000000..ea8264b591c1dd0579fdb3abb9041e4fc0004317 GIT binary patch literal 81 zcmV-X0IvUd0V^p=O;s>6WiT`_Ff%bx2rfy?OG(Vh&r5aA$xO{FaV#jv$xKcx$;{6S nNi8lZ*2_vPOJvwmx3$LJ;P-x)Mu%iZt4B(<3@w}hpaB|3{eB@` literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2d/6ee32362243ef322a02ec364fde6fc657c091e b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2d/6ee32362243ef322a02ec364fde6fc657c091e new file mode 100644 index 0000000000000000000000000000000000000000..25b36698db11c252a879ac0d8039dadc63e75e9b GIT binary patch literal 71 zcmV-N0J#5n0V^p=O;s>8WiT`_Ff%bx@JP+c$#>4lOwB8CEGWpyOinDx%+J%yN-Rrc d=rEB>aGdr_VWpML56h(Z42g4J3;>g(7SAT;AJzZ> literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2d/d01cf45e56702606e2e4be654cebe6c34a5d1a b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/2d/d01cf45e56702606e2e4be654cebe6c34a5d1a new file mode 100644 index 0000000000000000000000000000000000000000..b8bbaef22ecc0a42e78f1d24daaa12c19fa68243 GIT binary patch literal 46 zcmb9WH2!R0)>>++WUI4s&RAj`e=` z*n>76T8G3?4hmHv;IqWWgVG>P-Be0wiO?y(>(3b|K?ytz43l|5>4FNHJ(%J+5riK^ zLwI)HH||3ebzR3rFPR%#M%AGq7u_a{l*@_aOG*4(Xbp#FCTDdS+M*{O8sZzD_!uO$Hx8Z0? z5o6@@V*uq?n>k~o!dOpwO70p<+`@_)J7XVtW{l@)AB+zs2lD)%C3I7bG`dh_YjFTv z6YGB=vNCPX4+QSeQp0?y!-N+-HSI&B{puj@4>r4co6MRvqgw*95@h}{=13I0Fg6+z zU9eHYlTkVS8A?x5x-h!@`VE9F-3g_RMsKX)w$+orz9WH2!R0)>>++7HeoO{FfcPQQAjN9WH2!R0)>>+++e{>pASpXW zvH!kHQj{rM4qTvE1_X#m->-A-PgcgrD~varO}aTxg<9e_)9D%hdV4d=SFEB5 zueG6d&L-Zg^Qh>W)hU$}%$(od$6I`nP9gVrG(r&kO1lU*BB#dH)#f_xiL8Z&at=(M zbm2D>mm-DrBpZ)NB??x4@xU|p6T!W`F&HhCXyk_?19YjD3P@QfTCt5#k7-_trbsod zWXT8)mf%E{;R~7@@bf;2Gfli{l8bu5mx*FVZ3&Ky!L@Bf_Vc&cGi|s3AvhR-E%5h9 zmrzpnKo!Ber7gUMDo@Dn%)q>0I#*m;va|QB5-9Y0ArzW9;OIAtm*CjcW|CB~+5n@^ zvo#mO#4HWbWNi|d8D*GCeB3>Pb_~5qVOG;$??2qUPiB9=yPN&>@pDYih$vRV^sLz( zH7lGU@+wJCDa2zVk&lfQN>oTODKs}iZBdfg!2l*bBFBqlbpZ!rdrND&WL1D#u=WSe zw8d^I45n`VJR5ExdUQa9XcXe^CtYO7wa*8*g^@U6W^A2iD_JH*MX>v_wU3C-1?=)l z3I$#AD~Af&9mBHi?*WfCdKB5gP!JQ2f+r{_NIGwL3CBh>Drdj9N|QOE0p`8R4BOZV zd!TC?PD6H>op#xFgLmR15A@sXN28oH`pkeD z@@7UgphWJ|w-q1S0?Dp^=SZUO=Lh!S`1UJrS#$^3qc~E2oIZS8DhX~0hR?kbi#E2t z>Y%kpRk?q%Vv6H-cT(e7+NU}mZJT#j*9m2`>K-b!?HDLy=neoXIs#mx@5+1Fr-8IR zouxwlP~-#BHc*1U5!wZy8-vsaL|lRRo(Zse47t{3~I$`?-Bwz~nco%)$fBMsD9yDHk|| zBiI^w3?YPDjtHyiyktcyZ(-$3J9j6?1oz9{!8$-u@e;;L)b>Ulf^i%DeiDu@;0Zt$ zwA3Kfrz44g`3AMZ{VBX%LfgFRcH0NA1KUSXzijh{ir)u%fT-jB2&5Np4N|O literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/31/b09ff4de675cf3036d5299868289ce5629f4eb b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/31/b09ff4de675cf3036d5299868289ce5629f4eb new file mode 100644 index 0000000000000000000000000000000000000000..0db65cf03d47d30fa8b666212bd71d3b7339fe54 GIT binary patch literal 752 zcmVJ&aS&V#zYnW zy|a#idP_Dq_n}Hyy zB@O3sg&iClNHF4X{9n@ zvW2W0edZQ$M^6v8jt#btQot5Po?!0u#L*= ziCH6Fj9&Ct#~|l@|LsalRjyJlP0uSiN0^&Ow3;h|675ns@2g{inWt2!r6Nhq(pxud zxHJd?*7?CF%5Z7UgMe8WOU!33epgzNn4zQd{bgHejaE!6eaDq-16^sEP;TWCYhxco zf>Jw?%an{=38}fQ8d4&x$kg7rtpoPp#*iSUAyT6WpGd^b0av`f$8Hy#7N*KX%F1dI zY-8&6T8Yui+pyXB@cegD_yI6Z5sKl<+y7*33fj{ulYhrIL>pBNZ#z64-dPELOl)YkB6VlXiP0)^bf%shr)H;!&`yxMHRD^y-m&HZrWmQIa+h;&J6 gaS20nkzeoZRp&aFI~=g+u&uFMp!*{M0F$d5=Y>5XqyPW_ literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/31/fdaed8b7dbaabbe01424c9a06fc74cb0a7c4f9 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/31/fdaed8b7dbaabbe01424c9a06fc74cb0a7c4f9 new file mode 100644 index 0000000000000000000000000000000000000000..6bf9a1fd8c860291cf55208dcbcfb32a66baa24d GIT binary patch literal 46 zcmV+}0MY+=0V^p=O;s>9WH2!R0)>>++6VlXiP0)^bf%shriDkbweR_)t3>6YoX4#o25x+g3G5b2WC g;u401URG0iznty9dvw>z{fjzN!r}vL0G9n6Zn1z>% literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/33/764af82504ed9f0099d4d34aaa0a62032e1f94 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/33/764af82504ed9f0099d4d34aaa0a62032e1f94 new file mode 100644 index 0000000000000000000000000000000000000000..fe83c356716fc68b480358da1473c84e8490ff8c GIT binary patch literal 79 zcmV-V0I>gf0V^p=O;s>6XD~4U0)?!^vP6bX#%T}p_BV-)0|3DS97+ozAcg<{ literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/33/f1976f98d889dec82ca56d2fb24c7c3bcffc17 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/33/f1976f98d889dec82ca56d2fb24c7c3bcffc17 new file mode 100644 index 0000000000000000000000000000000000000000..6ffbef786323a6ad687c32c369145df8a3f57347 GIT binary patch literal 47 zcmV+~0MP$<0V^p=O;s>9WH2!R0)>>++o^DnbO6$>;#$d-F!M*B(v8<+n3$T5{&_kf7e2jyUajKAdOk~Fxq|6(aWh}fmkS!*LcI6{zs?soBS7+u(!r-n zI|US@aDL*ZH7`MD`g3BC)4Cg*3Nw+5jHJn;<^@8b9#KnD1QqI?FfLa^1UHUSDR#ng z+fE(3p_kG)49Vxu4rqfrbrpuhLTTHM*e!}ePKlJX4@5UXO=sPaS8?aD174%ChTZbA zObKX3qpslUfJ6zhziKHgb6dYLt!pV!vsEqKAx8?X&{UeF<(luXQTj7WkxRpJo>`^$ zj7w_JRvwFMs~Xn=CkMPJSIV-a#q3G=ehJ+*l_{BvqSnY}(sh?Raq8z<4&R5dWB?-^ zi%$m{*Tm?BFW;nnrkFioI+Kq=E4ibr&JxK=Rd1N8Q06XOFQ%8YIbZJC_pHCBO#W}p ze>bj`-8=0@Xe-bVfOGNexhIabE%>7kpL&g2?$~O^bx}r_@X)HUF{mx$?blk@NP8!~ zL!+*NIt-STv}qVly2(SFQFD?A{0yfNF?u0xmLLB7xLmEN_*7I_)hRt;&_Y8mnqJSk zo-y!G7zUH))(->f>_=`9?sa**iG<^BFewNou8g*I_>W3#{36*YF|#Hb5@rw_bw^z> z+hSR&XxMfyJ?ADG{Is>ZaxkPHjNprdK8cjZ|8h&7S9-dPW3DU_p!e5j(TR6_d#YQ( z2l{?vt71o-qJ-XXS^WM7a9x;ANbusaGhNH5cXkiG%W~9}ldM)(Fme4&18>^lrR!cf s$o<3TjSDo|T1$}F!0FD&8Fd!1m)HUIICTcUzv*xWCGsWw3PP6d^o!ZbC;$Ke literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/35/2a2d85940cf5bf182b377eb64661115387f987 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/35/2a2d85940cf5bf182b377eb64661115387f987 new file mode 100644 index 0000000000000000000000000000000000000000..8e95604975624e3580c4948451b1ca0f8f66331d GIT binary patch literal 72 zcmV-O0Jr~m0V^p=O;s>8V=y!@Ff%bxaL&(5%S;bWEh9WH2!R0)?!^vP6b7i^5me@0pA6TDR9`{E`pQzqLpk0QOD| E*Q#k0!~g&Q literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/35/625e0d2f5d6ed98c236d3fe5eb74118411ded1 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/35/625e0d2f5d6ed98c236d3fe5eb74118411ded1 new file mode 100644 index 0000000000000000000000000000000000000000..e2c43fd15d50f474d2216c86d7891701c810efa8 GIT binary patch literal 682 zcmV;b0#*HZ0fm%NPunmM$M;%)ic_Be6_>$Y7%vT_)1skNY6^%)C%L2^sh!ylp+bE3 zo!zXoL)!Y#*7p6+|NEWotkxNPKEJ&9G(KT)0#n^=jI34;&d)wyoYL1NxD|q?NvT8) zqID~6Xx#s^oMc{kD|1v93usk=CWxX&kg>()d1DLA3)rMf?JGj%##caXl%6LR z0bYt8`mSS8(z+kp26I`;oJvzwD=LIaKci7p5j1Gl()zwyGFW&^wOmUlT$p-44SQW0 zGe(@Be4+x^`ie1fp^YOy75~{P>G%?@yZSh7TBXqNMXMgDl0%_w3>hkoSYxNn6VFg6 z%S(|vZ8lseI#$6Hk6NcY-?)PfKFGCp+>s5QYvu68@ic63P4gez{VmRG-4;8c!IE&V z_;j0Su^poM=l)^qJ=ZtVIEl8;@qg(b*MaAk-aLULe(&6@N0RSxkE})GxClRqc1c^; z6h7&RA8i?I)9}2exMMas1j8nWR$0?#bT=SG!@W?lu0^!HFaD5tm=<0c8%%bcVFP0Q zEF98{6yWce(X9(GLluLG7gO+dhi5Gdy6{18t3_dtj_Ldw-C3B07sS6luWT?lDDP;O Qk)EN!8)I+mH@0HOY^RP=g#Z8m literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/35/8dbed1f9e69a7d91797f13e20510c615db3bb6 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/35/8dbed1f9e69a7d91797f13e20510c615db3bb6 new file mode 100644 index 0000000000000000000000000000000000000000..4a24bd7d054c70c7b8807f1b4b15a6ccee934361 GIT binary patch literal 118 zcmV-+0Ez#20V^p=O;s>7Fk&z?FfcbYRS0r*bn$i7%S~aZsgQ1JEIzTCA-2Ds-?%kY z@&->RP?4F5i9$hsu3klM4#WQS_Z<)Z_Sg2PPhw&@;Wg*X0=|nT20)-tT$Id^=c=s! Yz^Gf(F=i7Jx9zs~!EQU#0M%0_Pvhe^+5i9m literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/37/cb16dbfa3e7423a69a17ec517edd97fcb7ef02 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/37/cb16dbfa3e7423a69a17ec517edd97fcb7ef02 new file mode 100644 index 0000000000000000000000000000000000000000..142827118e1d74ab21349dc55e5bf4461042d807 GIT binary patch literal 116 zcmV-)0E_>40V^p=O;s>7HfJz2FfcPQQE*93ODxSP2`)*@OG(Vh&r5aA$xO{FaV#jv z$xKcx$;{6SNi8lZ*2_vPOJp$IF#pTF^q9}gxj{4AnmW&gX?}SPHHSC@_G(V=s=IUP WgPO~)31ZRjZY+>F)d&F6_&dU;XEaFw literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/37/f118c7184e629851b89216772a45cac4d1147c b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/37/f118c7184e629851b89216772a45cac4d1147c new file mode 100644 index 0000000000000000000000000000000000000000..cfa1ef91598d727fe32ae5ce09ed30b80d13dc42 GIT binary patch literal 79 zcmV-V0I>gf0V^p=O;s>6XD~4U0)?!^vP6cT-fHTl=iSQB<%IK?Yj2TnndfN_kuFLt l&Mz%WPAz75+@__^cCGBR^);iwNej<}%sQ0c2mrKW90Ra;C71vJ literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/38/0c542cf4bded22d0edbefd27107fe372e0e62e b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/38/0c542cf4bded22d0edbefd27107fe372e0e62e new file mode 100644 index 0000000000000000000000000000000000000000..2b19dde081103cbee9d44dde8ae0779f18635603 GIT binary patch literal 70 zcmV-M0J;Bo0V^p=O;s>8W-v4`Ff%bxh$=132`I|1sB|nS$jMAjEXmBz)5}UMOJryg c`yT7cG56(s=V*bJtIfw)^51&_0DL$W_`Ap-9{>OV literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/38/3d81c39f4da8ee934b03dba7e753ed051af409 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/38/3d81c39f4da8ee934b03dba7e753ed051af409 new file mode 100644 index 0000000000000000000000000000000000000000..756be7f587fba2d0c4917618d2234cf26aeba629 GIT binary patch literal 46 zcmV+}0MY+=0V^p=O;s>9WH2!R0)>>++0EGW|0V^p=O;s>7Fk>(@FfcPQQ7FjI)vL(OVPM|!c7w_uCzdUaaqL{d(|Xr@ z%I*a!F*h|;C@RgeOD)nX&S2>dxKpuQ~s|w@PJxb?^G@L;yr(EIb|OIp6>Q literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/38/f222cec182df9dc13b627fe2ea51e707c00905 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/38/f222cec182df9dc13b627fe2ea51e707c00905 new file mode 100644 index 0000000000000000000000000000000000000000..9f8c3750a91b0d40c6d619b44a0fb165e6d55e35 GIT binary patch literal 73 zcmV-P0Ji^l0V^p=O;s>6VlXiP0)^bf%sd8d1GmPVAMVO{N#zT$S$dYIXG%|oNSCA* fmoTVKSJLjW_15t`{>Lt;<5p6*v%*OL^3E3)U=tz? literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/39/070812bee6a0498396ee1441278f5678caf170 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/39/070812bee6a0498396ee1441278f5678caf170 new file mode 100644 index 0000000000000000000000000000000000000000..d69fdb9e88443debb52be33721f48a87b04bd991 GIT binary patch literal 74 zcmV-Q0JZ;k0V^p=O;s>6VlXiP0)^bf%shs?65}N|OwK-;)|b+!JfUQb)&{v<5b2WC g;u40rnjW>D?|64Q-dJeIbVQv=_Wk}V0Cs~K<)SVl1poj5 literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/39/f2f11ed1f77f0259967e53ecbd946d5b422536 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/39/f2f11ed1f77f0259967e53ecbd946d5b422536 new file mode 100644 index 0000000000000000000000000000000000000000..36dc905ba4215614d41b2c66f77a8d3a3385afe3 GIT binary patch literal 1019 zcmVU*J)4WEDWSG zGI=yr*v$MDIjm>JbV6!bG4V$LUic$|2YXX6T5H*=w^ae?a-%emveL9>JE^yMDP&va zhSo|jf}A9UKDF8Xpj9ZZRncS z5o*P{1I~=Y?kJ3=e*JkiygUYUK!ijQsR*(@GTe2@2e?ILoFN^Tr`;=7C|MKizg+GU zVoC|SyjD^}mBPxSf^w&@T=@sUlZ^pIP8b?uLSqDi;ylThEf>&4vehN~rJFm2A3MN& zm^sI7oWi^~pt-0qMFl#|omgKfC3u({kh_ylXW=~V=>v^zR9xhj1P^w6P_OUMvc2hV znz3fb%gsn*X>EFQubTvLs-4I{Pu)H!CJvC3qh=_OlllnbB@6TAP#|f6+_i@~{pW#q zW)`t;8)jF6KX!8tSmn?&Uo@-HC^^dcla1d0=KkG{7XZV>$LTVoML4l;t5 zuNCZvF!bCENXAdNH+Y}AenNuoTJ2x#031k#dkd>ucp&{JNDgA-v2B`u{B~3l+z||) z{cMgc)Ngbx#QO)=G*p?5v@juI)7=`L!tU`}JRNs$9vHM*6!Bk#i`+ff!q{e-ZFE(NPP+;Qbi@xYegA%Z7_BS1A5P$t>9nSTt?ZE}7-q(17| zm{wF6DCU;|1#dE=<`ks&{pneNx?pG2J+3$LVvxFe-@%354J~D?5lsgh>Nd9 pmd9`$Vjh9(#q>Xr=zjwE70dMqo;XE^BAvo^_*+#>KLPO%uavh*`Ro7y literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/3b/0be4147d56f425a14d04a992365d061ef4b992 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/3b/0be4147d56f425a14d04a992365d061ef4b992 new file mode 100644 index 0000000000000000000000000000000000000000..3c4ac9a3c23c6fbcfa638e030ebf644499bbfb3b GIT binary patch literal 115 zcmV-(0F3{50V^p=O;s>7Fk&z?FfcPQQ3!H%bn$i7%S~ZObV`v(Jr?8Ts`dJ_^37wt zzwG6HLKPL{=jv7D<}l3hzJBZ7%Qf4Qj1R}0VPMP;>SlH|F#rOE;-X{*9>s`0)-(4V V-u1m(B_4jEdYh;BW&nMODrFiGI1K;* literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/3b/87ac49b17c51472014e581c7e26a6b6a76096f b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/3b/87ac49b17c51472014e581c7e26a6b6a76096f new file mode 100644 index 0000000000000000000000000000000000000000..83f9b04fe62e258c85fddad51eb239c9e32e07e2 GIT binary patch literal 564 zcmV-40?Yk)0gY3^Zrd;n-8K3OBB!=UouoT$xztTF%vg~Cak`=yc93P-A?iq;B-aUw z{`)A$*wXE=`CynL-_zqGomD1->0~l}H@*;X0drFyER|aiSCi@cOMZO-zeO;7NLp4P z8^1M{cEKA9Z#a6QI z{3$JR&YK{+wd6^cBXFkht+W`l=H$GktnqJL>$?H&{j`96lNyF`3Q0PIn>bCv*|I7AdUOFkdZilTET(a`Xw}v z#bElci9x~n5W5-`6{NT|T{f~rD9tlk%^g9Fc1JGE)v>@lNUCT@Ui$9n_cokNX)FZ$ z{1k|C+?kmWtio8&ddkSvmU#;+ci0;H6lKQvDD4j8qsf7J_D=|Js!>K4R5liSf*a=g zUlLWBCXY1wqN07|C`To2w9sM3=`mvA*GFZ45R2ç¨ ¹ÚëZp™#´Âíúÿ ,^ <*sœÚ9tªO,úðRô¡ÿš”T÷g«1¥ÈÉš¬^!Tê€F’#ÐhöÂú¹ZXxIµØ Ç]õ{N¦2F9?y¢÷jΩPÆ‘ž*°Úoiø[ež‚L)¤ýet Ù3Ïÿ ¡MU¹’¥¨ƒÁ-q½"aá´ßÞ›a¯—ü€vhÈGÈnŽ¿ýÅt“Ѭ!¯9Eè‹4F®£P?KS?29iI{=C_vjo$psVA!Bd*d#Gwq+=|Pq^js{0^B^f8v z;orM*ObIQ}9(p8)Or+I5y?y(%Nei9A(ZRvto55ZHdoa@F#>jl>X!G#hK7G9hw?xpi zDHSh(S8k~dt=nIgQJT-ZkOGy(3@VkOX_BIn3(9RHefWaLO0D3C9YEKkhHWV94L!t0 zSFqw6P})Idkuao%g)9(oEwFST6$rg53(1v0sHIyr_p~UU30$`rI(3|mb4n;TpclIb zfxDJ8_|MY0(jE^6bzL*wP-fcXgJN5d9bCkt@gy1V6YVzbQWa<|82nyILnWsh;3d%# zJSDOPuN!@GgA{Yx)2@wlQssTHdf{qr&~weCbw;L@d!$-h4N&d72S_)rAdC`-lMqg$ zBu@GsJF|;<13&x zO0Oqojd%%q(SLOe78LhuTcVH)DX27+S3F0^^(`7j6+ww+C9UtPC4!l!RLGTd+%;Pd zZrJJ4APAnY+goq956y+Ic6+tkf3+Ju>l^P|dZu<51Y~+`9N9l-wlrkph2bl#wYg!b z){fDX(?Y9-%qxRzto*xg1xGH3VeQ4@a|NGpeHDoW8{ZJ4uvucOA4rBY?P*)y7ZXx(QLlcam`?x)kO zBLdFoqCi94IC(@TIC)0z`@nCt2PZQk^8gr>RZ626M8RpoC4Ro)j`Z*&2s-T%>*Ww| zt7S%iJW_QNn#U^t`VF|rZI6z2Itpueu7BM>(5YW^Ymf3e9ab7m)6q$^-EeC&CK>}V zMQ%H`4YjbxOr^Tbg~On8N9?GeU4gsdASA?=^Ohnku_$zROVOaK4E;Bp`@L`rau@sr H9yYH-NSs_k literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/3c/0844a83a874210e64f833767e922d1f3f4be4d b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/3c/0844a83a874210e64f833767e922d1f3f4be4d new file mode 100644 index 0000000000000000000000000000000000000000..20542773f314a2b3a57ff122076a4f49fc85fc02 GIT binary patch literal 70 zcmV-M0J;Bo0V^p=O;s>8W-v4`Ff%bxh$=13aV#jv$xKcx$;{6SNi8lZ*2_vPOJumn cSFy}w&$NQDKI1Hfw3v+LNvlo*0C=hv$%`5t2><{9 literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/3c/3e546f40587167ace1fc720e1b68292bc7c867 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/3c/3e546f40587167ace1fc720e1b68292bc7c867 new file mode 100644 index 0000000000000000000000000000000000000000..782ff204600296c3112e34399e57a3bf0c6011f9 GIT binary patch literal 178 zcmV;j08RgR0bR~9Zo@DP1<=kp1%YfGIC#vKHbF1Y9)Oa+Wg(JiNOW!AzDm)l(+7zE zKIoD<8iwKJOrLXXw8=q-t`uNoN(~^JLD)SOi&}bPM)|!>l9Chupw7g5w1)ANG=x|J zCwwEZ*USYrrMUBaG^;(YuBUi=*PNw{m)rgA>*Jr(8n`XB4^34vHmwhi#Sp4IpZGJK gOF%|3Mj03Fjm8@sV_&qb72Wu>j<~%30D7cUwpYYfzW@LL literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/3c/d2b3a67331365eb7aef83e9f39a94625becb6a b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/3c/d2b3a67331365eb7aef83e9f39a94625becb6a new file mode 100644 index 0000000000000000000000000000000000000000..58ae63098595992322ab0621d95d5659a80cd208 GIT binary patch literal 47 zcmV+~0MP$<0V^p=O;s>9WH2!R0)>>++)…K÷c/iPÀŽët¶6`9-ŠE”4’‰R¤JRQŒEþ{‡”šÊMtëƒ!Š3oÞ̼¥R§ðüôïÓ¿¦O"x ]Œ(÷^<{þò)ý‚Û#hz)—À·×†Îý“eäæ=ß‹ •Å•£ NóšgäÛßLà#+´‚ìÄuÜ_OÎ<ÄA7Pñ(í ±HÂB!$^gX; +2]ÕRp•!´ÂíCœÅ3Ï=†N'sNõt14îzÒà{çjûj:mÛ–ñ@™iSNe—¾_-–ëdù”h÷n—J¢µ`ð[# ¥œ€×D+ã)‘•¼ õ) ÒÓžvk„ªœ€Õ…k¹AÏ5Ö‘6î¨j}6@¹ ¨n\ÁxžÀ*Ãùp|;QvxíW4o¡[ì¹zÐÇ:4¨Ý¡F¶ AÔŠØ=èÐbÊR¡òa”- Z÷F†ýÇîH‹('éÌ ÇŠT¯aŒ×œtã 4F^0Úô²àR¦¤@º¹è»R³LrkO"Aµ1§-siä–Øv×ð_fÇ ÄW\6!蔫@‹p…3{»ÜD£„ÆFfRê˜v^tCôïL4»«‚¨nRÚ1( ëÐÁÞÎú®fp¥ENkU¨¸ ÿï঴'d:Ý‘;3ŠïÇîj3é¼Ï¢‘ͼd¢Qq@¤›7 4»¸ߎãRfAÛ ƒ®1 +¶p#ö&Du4ÛÐÎ1"Gè#†ä<åÛí‚èót{£[ Ëð ñߟ8¥~ 5WŒ ™Ÿy'UÜQb}¨AdvC7]¶¾[·²ú6É'lS Ûé>áüL §,ˆ@¬/ÅXëÚŽÄý>ªÏ \ No newline at end of file diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/3d/7257e7634312e2433d345ed71b33627a28e19b b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/3d/7257e7634312e2433d345ed71b33627a28e19b new file mode 100644 index 0000000000000000000000000000000000000000..902e655a2ad537d21d8e314df627594229d8bb92 GIT binary patch literal 1018 zcmV6-nVBk4LmpC6|8%;JH7dWUw~|qlH#&^QO!JU1k~$q|7y|_*&^zR!G&B znPF8UIVI5&oS3#^&I${D!3TR&98B>)Z7VVGx!GdgYQAEWBp%@3RU`lL-_$+pwm(u5 z4Zs#iT(Je@mESW>$>Y*xUqh;=rr>SCr{t#4qH(n6uXv?Uto&SQH1!mqUmbEvQd4(b z!!)lgaQkWAW=h$VuS0}68w~2vmTMg1?y&So(?tfV&0cB3M-Ea%ALY;otxa$4b&~*2wG$cWsoMs{#Nlyt%nSu`R3EWpYHsIJZ2YL%)k#_>cl)kf z|9|FvVKQOZ0l5NN=c{J5H&G6C&|sukZuU}$+7D;F@^|=3mcE)$UawoA_pcick#{L{^UB{JG?jdh+{800(I60>R9p0uT?&KXci$R|7;=yiJbta@ zKZn`pMnN)#!o9)!*!3e?sCq6It@e+001l+Wy}8vbypjGBBnPp{zHOR*{B~4Q(h&@w z{fLg8)Ngd1B>Fek)T}W}Wnoalrn@z~hus@CeLU`-J}_vt%;O&k7rA@$GogqSGlOGH zEa9Jtq{P|#$nhYQenffAW|Eg3?zr-%WME6l5WyqDJwTO^P$pHo(SHchZE}7(q(17& znC46xDCXAz1y3_)<`|@R{pm@7x?m^N<+Cv)bqdm>p}*e6{|r%(JKK9z?5lsch|_OH omWOccV%`JSi|IR%=obO}hUIzyPn@Ddk-~2HbCr+(13Y)I-;)pm-2eap literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/3f/02bbda85368e9d2578d76bd1b7d2dd98f70c0d b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/3f/02bbda85368e9d2578d76bd1b7d2dd98f70c0d new file mode 100644 index 0000000000000000000000000000000000000000..68990441cca96b79fec207811f401eb1d45ca64a GIT binary patch literal 68 zcmV-K0K5Nq0V^p=O;s>8WH2-^Ff%bx2udv}s&vlJOUq0zElMoO%+J%yN-Rrc_@yGB aq#1Y literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/3f/ab0ebb702a6a6c9836111a102a17c2134b40a9 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/3f/ab0ebb702a6a6c9836111a102a17c2134b40a9 new file mode 100644 index 0000000000000000000000000000000000000000..0824b8c5a7ed5d1fdd400ee779d1f39de29d849c GIT binary patch literal 67 zcmV-J0KETr0V^p=O;s>8U@$Z=Ff%bxNGvGG$xKcx$;{8wD=5k@NG&SKOf6AXD~D{Ff%bxNXyJg)hnqeVQ_g>{HNk?!J(`$z0245+?IH@ wi6=qTlxFG`6y+DB7L{bC7BlQHv0u$|>Gpz}YMb2~R5Bm`tq2*UW4BtXu6b2 zv><}tXiMkem*X@RC$D9R%3%dTRcQO6)QFO1hsq2-p>7bS^0zQ>!JV*tl-kMelRU&lKZ~Auzl*k0`2Mk?!LG6MD%no#Y*a*T8 zq#=Gb-W&HONxH7%qNmKYZIX5`$R*d=;%b>+9TV+g>{hkt99aAsq$SD44um0Er6`DO zE4tpF#v;|cj<83~H*!vol!AT9zbDH9<58jebO{ND&ycTj}Cn9TBV|rB-gG7rwvxm4<^Y zC5(~J4-u%st)4SREVT8+r{T_6!mX{?VyEo`FSPcYVy8>3YS{#fJnvgBsF3b$k8jQY z3sMBxQZ|S2gVBq9fp{cGeVEUOnCAv5X%^ngqKL|V++T`EgnWmVE)#bCS3b;yf+7KB zE6C~GlR2W*3KwLzIwTI?7#j`EF8Wr&qm~u@6{MQvln~W?{sO`_Zc44Ak-`r4Fa9Zk z`v3V3@0m;qVKm~#YTBHa=qBU6<5bq6;(M1ls+i^Kt+xTkQ*MKr^bF=~^vu{Z`wpR7 FZXoG1HIM)R literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/41/5e77f8b87b7410fb2e332f5b6cebb47b7ab3b5 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/41/5e77f8b87b7410fb2e332f5b6cebb47b7ab3b5 new file mode 100644 index 0000000000000000000000000000000000000000..a2e801bb25a16da9991d91480c50ebef12ccd195 GIT binary patch literal 719 zcmV;=0xSVCWT7i;_A!Qr@?6er!Z1wtwp}FaCv_5`HX(Pf?XjfS`?BO zz@1$wP4jkS7^V5lTaltPn1PcS>Lw{Hc}ltMP9J`uHbP0bWarTHsNHs}dvfg|YUN0;QFuKu zYs8Dui~i~uENS1*O^K;kij+!|x#KxPuAWd!st8KdYhk>vh6rY!QX$sDa@#Du-G&{P z20=hNKYE}H*XlY5h=tOY_~h)jlftqE8hd@bteupo+1$x{s$@UWl$r=FHD6<;^dn1< zOT(5twMy5FOS)DKDHb}bDsSB00Y~XdS!Rg_OO>>^u`F&5xS{nUc8AGnp5iMBF{mx$&EG;hq}X9=Vs9(!7K0?Cpp#&@uXQlo=NXhPp>~5N8Wv6`LSndW zL4WVOKL-8=L1*}CcF;M{$+y?mmlroE+-C-z7XC?zj2@82{aeK|(>o#1&a=lo4m^O1 z%*1JYL8Nc>N-Jt6TbJ1F2Oav3VkD_b&mKKx?-@_8sOR<^`~#S{4J_Fm BWHJB% literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/41/f788ad3541b9bba23c35080010defe869a4d43 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/41/f788ad3541b9bba23c35080010defe869a4d43 new file mode 100644 index 0000000000000000000000000000000000000000..0d12c832fe3697dc1b32403bcde56a7c7a6412b3 GIT binary patch literal 46 zcmb2W-$IT&^kx^ literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/44/a0c3b71edc9b6cd61dda0a9b7fe75c9486177d b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/44/a0c3b71edc9b6cd61dda0a9b7fe75c9486177d new file mode 100644 index 0000000000000000000000000000000000000000..ce657ddead4d2dff9fd0c339941256168f17f7de GIT binary patch literal 46 zcmV+}0MY+=0V^p=O;s>9WH2!R0)?!^vP6bC-8V=y!@Ff%bx2+B-K%FlDo$xO{FaV#jv$xKcx$;{8w%StRu fWDuMybSP&V*L9gX#S?2{SKQM&rJ4Z%un-rb{Hq;5 literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/45/4c347a24481106a559a52744cfa7d41c602939 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/45/4c347a24481106a559a52744cfa7d41c602939 new file mode 100644 index 0000000000000000000000000000000000000000..bb31b4ebc3af0033e43f52eb4c5a5aa807777bff GIT binary patch literal 47 zcmV+~0MP$<0V^p=O;s>9WH2!R0)>>++K1ON-^ F5mBd767~Q9 literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/45/8049c271ed9f3849d8f3b662728c3300af6b9b b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/45/8049c271ed9f3849d8f3b662728c3300af6b9b new file mode 100644 index 0000000000000000000000000000000000000000..c3194fe22c42d4d6e685d99e5b7bb5a65ae1d827 GIT binary patch literal 1009 zcmV?N$7W0nr1MDyuZjC2>+%mK9h?DixvvG;WI*WX^!*IV#= z1VcBKmL?~SGF{+|<+#+jd0j@scC8ofmuk|wpxDYt(zg0E~+IVOj5{7cHQzZi4=2&}B8gf(BrII>FXqDfGb9xkJ0^fQJlX*$uk`n3z znB8$8NZ*qN{_MT4-MjI)ZCfD&WnpYFF1v!<`15=^Tcop>M7vM>qDyoREPij4rIND) z$eL*7G9$93Y(swvi}cJJrrlcQl`cl$%+9ycB6Hm;=dH>bf6}$S8lc*b1E_COLp(`g zp2l!7N$2T^K{oUC)$+?4Hj~wAvRKb&DJ)koT`n%?>-lm)S07=r_y(Wmi^~xp^^DZP z+uCvkB%|Vf;x;rdMQ-|oVz8s22F+jaIB0y`f4@6J2eI z(9X&VTVt<9hEhARlestcAfzT+1ybUxEE_xlf0Am97oI4H+-Q%tUZes1g6=+*|I|{A=e}(&a_wl z@N9hO&{1PAmGuhUwCmY_r`|U=NdBhpF=?}s(9ckm;M2IpZYllbQ!rO9O} zNMhPBg15pQVGoq{z!xOQ;GENklBLca-asFKlzXU=f=y3aXpHXt>%-(EC{BT|? z9cc1jJbK_jFTVTu&dEut+XL6b+5!0w literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/45/83d38d6007f03325f3116ff8d3d551432b615f b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/45/83d38d6007f03325f3116ff8d3d551432b615f new file mode 100644 index 0000000000000000000000000000000000000000..ba16eb1ade950e9ff571475840edbb2b7becfb66 GIT binary patch literal 69 zcmb1dod>Eow!^33_mr@eH%Q#AT4?v%K_ Zjr0GrH2sdz(@k5wTT>1*)Z7wt2LMBy8~y+Q literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/45/ad05561a45304f9a6d6b7e6be47ee5fcfa2636 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/45/ad05561a45304f9a6d6b7e6be47ee5fcfa2636 new file mode 100644 index 00000000..fae0a67d --- /dev/null +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/45/ad05561a45304f9a6d6b7e6be47ee5fcfa2636 @@ -0,0 +1,2 @@ +x-Ž1Â0©óŠ•(è,ÑAÊ„hèxÀ%ØŽÅÙgÙ†(¿Ç!éV«Ñìö,=ŽçÓ.Çä‚m``Ü?{gf0V^p=O;s>6XD~4U0)?!^vP1?Eg@dNXvt1%M#k4J!O?p3bioEPph;&hE laeir0a%wRHgXi;UMSD~~h9>MT4cT}tw{q=4RRDr%8)3UrAMXGF literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/47/52d372a47df547b2e6977d17985a0a2da172d1 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/47/52d372a47df547b2e6977d17985a0a2da172d1 new file mode 100644 index 00000000..1c210fd8 --- /dev/null +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/47/52d372a47df547b2e6977d17985a0a2da172d1 @@ -0,0 +1 @@ +xuTQoÓ0æµù§>¥SIé@HP@ëÊS‹– NrqÍR;ØN³2õ¿sv ë6Ö‡Êöù¾ûîûÎÉ*•Áøåøù“ÑA0SõV ¾²pølüü)ý½»BPt($«€5v¥4íÃÊ$”æ2OEŽÒ`,Pû¤iÍrÊ ‘!|Am„’p˜<ƒØ¡öC¨?˜8ˆ­j`Ͷ •…Æ a¥¨ð:ÇÚ‚«u] &s„VØ•¯Pø0Tf]g”PoA•ûÙ@Üoemm^FmÛ&ÌSN”棪kÈŒN糓Ezò”h‡´ Y¡1 ñW#4µœmÕD+g‘­Xëõá)f•£Ýja…äC0ª´-Óè¸ÂX-²ÆÞQ-tÔûþÒIèOS˜§}8ž¦ótè@.çç—çp9=;›.Îç'),Ï`¶\¼ŸŸÏ— Ú}€éâ+|š/ÞI3r¯kí: …Ó /^ŠNôŽAIq·75æ¢9µ&yÃ8WÔ’:‚õZç«!‚…£T‰µ°Ìú£ÛiØsiE¤ó•*p­&QD,”¶Ä‡'¦*_üLNç¨'>°Ü*½½—YkbTj¶ÆVé«$SÊ&©?œvö8Nw1ÿ—B3®r%KÁà˜°î€DGò½@T7 ä#}¿‰úJȽ<¸‰¢ÕÜ0K²:‘rèZ…Jqx6¡½„£í¢ñ¤ÄW ‡õF#¸ø÷\Ȳ³†Óså;ƒýìkt%U 59º‘ÞEš.oÀ«ãñ€¢ytŒLºU·›)YÐ+ú,åg­Èz»7¬jðmß0$L~ûŽ”î)ý!¬Ø†˜|é.•¬2Ø@'’GíKk&ÏÐQ R†63UUè<Žÿ¿é É&ßÑãënáDµ’”Ê%xT¼{æ.m„VrÒÞ®‡ôu2öƒœ?Cåßùúwf@–9-4ÚFKØ ÷)Ç·lTÞ¯æ‘\{÷á}àhI–hQ`Ð6J¡ÑØ•ó̈›•DÈRÅýN絃…ï7»$º[&°ó°»° W× Ó&Ïã¯é;§ô!’üû`šw-÷<œ„†å±9v‰“¨·‹¢]ôÂþ)U \ No newline at end of file diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/47/685c671d98b9f246084b5573d2e20667bbde04 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/47/685c671d98b9f246084b5573d2e20667bbde04 new file mode 100644 index 0000000000000000000000000000000000000000..b551c33856a90333475f46a60a109d2a66b0b308 GIT binary patch literal 82 zcmV-Y0ImOc0V^p=O;s>6WiT`_Ff%bxD9F#%tH{k^_-OE6KT)FZ<;%}6x^4Q@KRpP^ oe`8_*1PaAP$qcs_e2jI^U$E-zo9kT)@08rF>%AWU03+xh;oF-g>Hq)$ literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/47/75c95c39f71376410fbf299721056058a7028a b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/47/75c95c39f71376410fbf299721056058a7028a new file mode 100644 index 0000000000000000000000000000000000000000..b3f4760bd3941e47f773e4c0edc7f1f1b47b9204 GIT binary patch literal 115 zcmV-(0F3{50V^p=O;s>7Fk&z?FfcPQQ3!H%bn$i7%S~b67Sn6L=fCxcmE(Vg{U;ZB z3Rg7Df+{M=&(*8Q&0+X|c)4r8OZjR;{n_0sABpN}$jst3F#rOE;-X}Ru+`F@DqW`? VIGP^VtDW<#fA;3C8~_pJC=~;p|57h9tMgqME1C8<)k= z>3rPn=@nC<#cs68OaV$NQ~=Tl!s;<<60VO3{=44h?5zJ#&8+t*1znRRgv7yQe36Zp z!7#MXX*F>xI#pg=rS*D~VX)k__s8}9Z0fWD16U2X8zr$8v%ndwqm+4qN$m67p*{Qn HJF7tnbzn~d literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/48/5bc91281552b177823505477795d82fd13a3d1 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/48/5bc91281552b177823505477795d82fd13a3d1 new file mode 100644 index 0000000000000000000000000000000000000000..03a871b3cba6d9b8c36809ae4451b0cb8894a00b GIT binary patch literal 782 zcmV+p1M&QL0gYALa@sHu?JNF@9iB*rm|PxuN!tmKWa?=O9ZZ_ZqinB@CPs24Ifi!f z?_C*%%RmD>FcR85I(yEph;kXh*@yQR?>fgG97A6gbH%fXf%DU|ixc|#2xfvH=|?VD z4y-g2sc7$3+NU&|dBlmg6H6)QQ*M~4e_D0J znoAweBb}ctP=Zr=>3PILDr4RC1)4PHGe0I;!uYWiDbM_%UvK;M?s8XrE?E*WVi=?H zd#FwKnep5@GAeW2pR#~1RZYCdsFg!hROKDHv_CueNn#ujb{H26cCYgNcngY$#vNA5 zs_d|gG@4tU8&oTkXgGXbD597uHpNP+C+m{InemyR;jI-U3z%3EJ1}R%1G=$uT)!<> z?$wDDijpZey&dmrBi<{@h-MJtoKb84m|tVc%G`{26iKm&gukBGxU$T=hKmlYBS2$F zL3Y_XqM$}Yp(&LBffa1^Qj4Ce#>+O6bJ83)h>fXX zEjOSILG6%ZC}7=klPYNSPvHCK+TTGX`1T2~El?Yjodo7B)tW{}Q$@G+UC zv!M@io6bL9f1Sf^a&wbR=jr7Pu5Vy`J)NZU^m@u)pCFljhcD@LG6ZDKSRH(*tgnD& zRGv@F19>y_q(3PJOWyb2uEI<$RmP?1qLu|hVeZjtt_Ui$YvsJIjsfN#QmNL8B!#7I zH|(f1ieu*a&IihIZO-GEQ5Z{%rw~7Ctw_w#(fRSRt+hrgZfbqYmFzpZ$}*s(m1}H_ zy%P(R+KHvi$k>gLn%gRX5=l*_@xtvTIC3|J1ThSe8BO>=Vipp7Re>Z ztR}%SW}dH&m^{9X!_GhRKNG?q0OJ&)7(c%Ke^iaMEY*X++TxuQm*Me0VFE8Zlunc- zg>Kw3_0PKYC=Fu2>zHL#S=_Ct&g+%!G)3YZS`som=C($*z36(O->TEbVCLCq5MS&| z7GLb+jH`OVrxt=Wv@Cp5)=|=)X5YeIY6rjKIJ$W1n>ae)%AeF$;zwcG+2 zoM%yJq$?wH*B@}u=(mr1Ya`NBfgIO zG_%c9l_%wMeZ@mM+RYu}^q%^0n}_-IeGhJB>N1Cwyhk3yZ3&NiVR*0jPs7uQXA%E9 za^&>A7G1ypEQoEImg<2hkS6=|Gr0j=6#32m$$&@jQ+a=Fc3&H7@jLzlGZcK5F>t3| literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/49/2833a3ff9bf5a82996ecbd9a8f231eb76f692d b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/49/2833a3ff9bf5a82996ecbd9a8f231eb76f692d new file mode 100644 index 0000000000000000000000000000000000000000..612e8f85a87824507b075d5ad102d44195740770 GIT binary patch literal 46 zcmV+}0MY+=0V^p=O;s>9WH2!R0)?!^vP6bsd)D{8i9eug`L4_Hio3pt>v#J(01sOa EeYcJk3;+NC literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/49/e41b0e2c61267e191ecae58fce84591da7d419 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/49/e41b0e2c61267e191ecae58fce84591da7d419 new file mode 100644 index 0000000000000000000000000000000000000000..5df02fd00c9dd15cae43fb3e464ffbdb5a644b22 GIT binary patch literal 930 zcmV;T16}-h0o7JrZ__Xo<+b}2Vd4QE9B%_8G?_>sKBWyN$`G$k;~h zZO3WaWTPM+hE%EkxYxet+;gv!3za8NpC6w*AhlLktgy*VC8RmMG5qD>!rJ;2JT5~y{X$(l+Bs~T?USEDZdxNH*UR_K-eEv#s+;x_k383bhT~NEgSwbEnlnAAkO`U|ZlbKdk zqFJpBw@R-QgdA!d5y7}*HIpTi#rm8|I%idc+HG)V9QMAcpWn?!AyiXt(J@MhH$(lq zcKPTr^5{oPqxVW%Dt>N}0_JvIv#eGX!G7dopAb_hSmjl%G-N5vJSyB>zV<2J%mZ+; zS=gcoxQn?SQ^NrNh#CTTL#tXaq0hqj2(0cAP^&u~A^*dtdg z-(|U9kdCNLNP9#uD9cf*+QMx6v}ATB_zhx>W=o0+!J$Xqo2WwH_^06v_4KT^!27*Q6RDIy^0d+7TN^!?mab<)@GrsAs7~2T@eZIaW?gDb28m*`(!E=M+nMlBwhalM5d&jsDy32$xNpr!Y%*n%f|K>2~)5)E>4+Uj7(EFHb>wZ43Sq zKcJ!@L;viS2U+a0f6rw(hGQ4=09+@g|3IRD1@Iorbp%g*s5>==HVVt(do4To1#6WiT`_Ff%bxD9F#%tH{k^INIG3^-N>xhS~Q;`}%rXKmR@{ o;bLL{1PaAP$qY*#W!&O;dU5HN0FQY;Vx+z?Wmkm*01L1lxwT6p+5i9m literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/4b/cd2c7e3e5342522c6f8b7746870d8685d092ea b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/4b/cd2c7e3e5342522c6f8b7746870d8685d092ea new file mode 100644 index 0000000000000000000000000000000000000000..7835e5aa2e4382e1c06dab513806473281e09daf GIT binary patch literal 81 zcmV-X0IvUd0V^p=O;s>6VK6i>Ff%bxaLUgwDK05WEO5@rOwB8CEGWpyOinDx%+Cu+ nEiNh6%StRuWYAVJ-ShlW+tyXLcz0)SvR(S)v~ei_mO>o%*cT$H literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/4d/1c87e362ab882f012dd4048eaaa9624562083b b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/4d/1c87e362ab882f012dd4048eaaa9624562083b new file mode 100644 index 0000000000000000000000000000000000000000..692e512172b9b9c9c25246b9550d39744455222d GIT binary patch literal 67 zcmV-J0KETr0V^p=O;s>8U@$Z=Ff%bxNGvGG$xKcx$;{8wD=5k@NG&SKOf6<`-=e$Y Zxz)ZS`t9qTs+Rx$B68>VUjR`M7`ATQ9$x?e literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/4e/7364be9bad7ffcc3ce046f75c0f8b3d81c18e0 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/4e/7364be9bad7ffcc3ce046f75c0f8b3d81c18e0 new file mode 100644 index 0000000000000000000000000000000000000000..56aa5b667757e9160c6e7615592e75ab01c00053 GIT binary patch literal 79 zcmV-V0I>gf0V^p=O;s>6XD~4U0)?!^vP1^0&MWuQf=|dOu2!_4GyN9pA)i|f5b2`S l;{4L06G+`)CEhDzUP#w6NqVE-1>(OV>**D9Fi7PAtjH z&(q6G%uTf_DJ@FM%uD5h(jW!S`FUxX=~l&=xdk~$66xthsp*L&`9*rkIi9WH2!R0)>>++o E86VlXiP0)^bf%shsbU60P*dmMjBps4ZS&GqkHn?8N|3z05K hEiPf$`NoJV?ahL)za|V}iF02}dAa2Jb^sf=Aj0@>Bhdf= literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/50/37bc102aa7f65329b5d3cf9c1e5894cc3337db b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/50/37bc102aa7f65329b5d3cf9c1e5894cc3337db new file mode 100644 index 0000000000000000000000000000000000000000..42f40fc24d68a51183838e9418c4a96c70195361 GIT binary patch literal 729 zcmV;~0w(=<0i9G$Z`wc*?G^uu5hoH6lcedP<$@tpv6_H{Nu#LhVQr7i3bX6(t}#}X z|K3^KC8YUiRSw9zd$SHR8N%6zi;H)IV+W35BJ)b|bYUOPjjCjH$YE7gCOA%7JMJ1>s$Wd*$wz+B&7+Xmh-*CfBz4bT^ z2Pq94hkRaJq8K-F=s2W8DnoiwSLcd&6U8=IO0{-FWJ0?Mi;Ps2%LGkF&Fy-Hk)`#2 z_$FLR;|4XS*JNac{T)JsE+Z)to)!vQf-!OZD@l~eB6cJ4Rv0(pDk``M6|yxdcPi|l zOq$Jcv-zeX5@K*?4!a+dEpK8<4Be26_z<+9iA8O0Xj;kR|A1>VAt_2`87hix)EN7R zFV5(t2A$D@j(&tYc@ff;fhc1%iC2}q3%dh%;iuztM*EPR4rRDy2H~a(P;KdU!shoA zN$Iq7+D=CVTghYkm~hbxh*zZFz5`RKJ|fmm=h-;8st~>B5-2{>)^CtQr}JPHS>yMo zy`ZJnoT1PZN`S!fQE-pGa}CMUAbQ6WH2-^Ff%bxa4juL%}#XA$xO{FaV#jv$xKcx$;{6SNi8lZ k*2_vPOJu0s$s64(QnqHh!hMOTNt0F^%b67d04lK<>TDw)MF0Q* literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/50/b9352be60f180b3e9e6cedc670b942a69942cd b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/50/b9352be60f180b3e9e6cedc670b942a69942cd new file mode 100644 index 0000000000000000000000000000000000000000..356e97e9cc44bd8b426d1bd134e50dd797120645 GIT binary patch literal 74 zcmV-Q0JZ;k0V^p=O;s>6VlXiP0)^bf%shtdt?w5I1x56>991a}JiY3Y`ss{rh;&J6 gaS4M;!pD7YwbMd>;8@ZL0EnI(BZFKacmMzZ literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/50/bf3c1d6afc8056227f42a56246ca63aaf9af5a b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/50/bf3c1d6afc8056227f42a56246ca63aaf9af5a new file mode 100644 index 0000000000000000000000000000000000000000..18db6def3a9a8a4a8a436b55b7fef980c33eb643 GIT binary patch literal 66 zcmV-I0KNZs0V^p=O;s>8U@$Z=Ff%bxNGvGG$xKcx$;{8wD=5k@NG&SKOf6>6Hjr|R YkbI)}Abrjvm+mWNYZ}DD04-V+_7FT8EdT%j literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/51/401846a6cf2780a52bd50afc3d1ead315ec351 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/51/401846a6cf2780a52bd50afc3d1ead315ec351 new file mode 100644 index 0000000000000000000000000000000000000000..97ec5a1565f70269d4d872aa936709da19ca9141 GIT binary patch literal 74 zcmV-Q0JZ;k0V^p=O;s>6VlXiP0)@naf?|gIFE%~eDtPy;Hv`}2#zf;sOckt)AkrzR gx%muJ9l~EL@qgdCz%-3r;g!askI6kI0F~hzCvHX|761SM literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/51/715f9f89d8cdf74328d8c25694b170bcbe99b6 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/51/715f9f89d8cdf74328d8c25694b170bcbe99b6 new file mode 100644 index 0000000000000000000000000000000000000000..acafa6455c611f9a75eaf8676c5e3b7b85592bff GIT binary patch literal 102 zcmV-s0Ga=I0V^p=O;xZoW-v4`Ff%bx@Te>!2!sFvXUo<8Z%&QK=CsSW`1z6{;~ literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/52/7842f72663aaf32bc9bbe8c4709d25d217e73d b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/52/7842f72663aaf32bc9bbe8c4709d25d217e73d new file mode 100644 index 0000000000000000000000000000000000000000..aa244679c564cb53fb3017288285f130a4249e1b GIT binary patch literal 822 zcmV-61Ihe&0hLwDZrd;r>{a@Tg->?j(&+;z+FYXADJnE@ir8(C-e_qpvyn-akH|ui zfA5k~{D_+Z@xhkJ-Qn!aa=j?k0$#uW@b1OvWehK2tg1$fVrAjY$?LbT=<5U66@sEg zA$bYh*_G1t-aQ#cX+HBpWGD^h;AD&jkIT#r(J7dg)D|()Y8^mqvx6nW3^Z~d!SlZ4N&d-0i+w3&`V~J&U)}E znWeL#2f0q?UoOAT;X1jxN~ZJldHIU0LoD!2w6 z4lRq%4td6vThOhA5Dh<_E5B*AX<9jw_D1_Q_I4Zi6UWinws+#_kzW3`wl+VQOW{5< zj=E#+l*nlwg=V@?JU9ITfkyWp_c-toTxwccZBDe)px=8G=_g0672QqSRM;EF5q*wg zB&kbNlqTa-eMCb!+CL}Y^tS!CtC#fieGX=&TheYchVv(J5*WWjy>7vkxA?^f`k Au>b%7 literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/52/b0c65e622564413d50f64906b9cfbd5551ae6f b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/52/b0c65e622564413d50f64906b9cfbd5551ae6f new file mode 100644 index 0000000000000000000000000000000000000000..ae80340684ed6846d60ab4cda2f619b7808d7b5a GIT binary patch literal 568 zcmV-80>}M$0gY3^Zrd;n-8K3OBB!)S?X*1%TP}6e3^P_ZK%A~9h8<*?c7!^TCdqY! zq5nS0F}7?ybUqjs$@ld5NEeMR;Cy!Z{#|^^;1m|x?5(V~9xi6*muK|)0Dg<0DJT_h zfVY0DEuDui7ZEHVZ>2!xu!L5XXnRm%xFGD1nZj4JPHF`g(F`Vmbv&fTC-XqD*DdV$ z9+dXbIwTJ1ppp#&J_|G+qynLLrjc9;giiWxf6u@Yl)%Hlp$pHcoD;z8L089x!2KW^ z!n5_>xQ}t%bzQ`J$&t2o+#DKm@olL1G); z_5RcrDd%;N-C60Ss;A&|{0WW7$ZO}flswT8tiyGb|cDx=dUNU{g`l4dtkK=O>HgU`l>4rq)r_=#n2 zUXH=^-xGt1^5N_Z3Ry`(t*N@@HA1bQ&?@Q(4BDM^VXlq@mO)Y@chYm;hyHBC(UfAw z$mhpERN_w086y?ideT!z&RF8DEZmU—ŒMBŒ¾,k‹ˆ˜Rié˜&ă“ܤÖÛØN³íß¹N#è@ˆ>Dµï=Ççœ{³Zepõîý›pÆ`K¥{#ªƒ‹ó·—gô¹·CPt)$¯·n§ Ç6 ˜GÞŠ¥ÅZY @‘æ9aÇʾ ±BI¸ÎáijNÇÒôtá)zÕBÃ{ÊAk‘8„…RÔøœ£v $äªÑµà2Gè„Û ïŒ,^ <Ž*sœÚ9tª 抛¼0öòŒ9Jg \ No newline at end of file diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/55/72d7476881992748fa29d7963f98aa0162ae5a b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/55/72d7476881992748fa29d7963f98aa0162ae5a new file mode 100644 index 0000000000000000000000000000000000000000..067e21792d382348a588e0abdf182c78a8628dd8 GIT binary patch literal 47 zcmV+~0MP$<0V^p=O;s>9WH2!R0)>>++9WH2!R0)?!^vP1?2hWITfcb=+g{jc@ literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/56/ab1b49248acb400882e03f26ce497fe6ecdd1e b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/56/ab1b49248acb400882e03f26ce497fe6ecdd1e new file mode 100644 index 0000000000000000000000000000000000000000..edf84951d1ec95b09635e61e6a59cd73b939cd03 GIT binary patch literal 75 zcmV-R0JQ&j0V^p=O;s>6VlXiP0)^bf%sht9pyM;`Q{LAvyWq9|z3Y{GN8ESKg-DmA h7MC!zKgcP6zNADx^oNXg*ZJo;Uu>qI0RY?e9~44xC0GCe literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/57/3df7e0031efd9e07d22fa7b9d7b5c623dcb476 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/57/3df7e0031efd9e07d22fa7b9d7b5c623dcb476 new file mode 100644 index 0000000000000000000000000000000000000000..3d04f68c577562592157c8156534f9dedb380d0b GIT binary patch literal 82 zcmV-Y0ImOc0V^p=O;s>6WiT`_Ff%bxD9F#%tH{k^5c&{caQ5xy_pK}2E!vJ5CSFwd od&tB92o#Eok{Pbv+&5v7@}1(#lJ`0eZ#FRV7Ythj01HkYp}Wf??f?J) literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/58/412ad107c42aef9def9fa5efebdea718c20ff8 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/58/412ad107c42aef9def9fa5efebdea718c20ff8 new file mode 100644 index 0000000000000000000000000000000000000000..a16da34eb75d1fefe60aa81fe16cd52566c04b9b GIT binary patch literal 75 zcmV-R0JQ&j0V^p=O;s>6VlXiP0)^bf%shsdp)NNj>|E@ny5`$5{V=w_PeUWyAkrnN h#U%`K`s=EXtdKdp;n4mmud=H|rgNCN0sx-J8|UbeB!U0{ literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/58/968f9b2a21276b497c299eff74d9b42cec071e b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/58/968f9b2a21276b497c299eff74d9b42cec071e new file mode 100644 index 0000000000000000000000000000000000000000..f2dab0a1f61b147232973fa6ca07e1dce6c986f5 GIT binary patch literal 81 zcmV-X0IvUd0V^p=O;s>6VK6i>Ff%bxh$=132`I|1sB|qYO3hAmEGWpyOinDx%+Cu+ nEiNh6%StRuWC*Ho`mUC|>a+IA-7k(5%vHT4{@fM-n=>5K#Q!25 literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/58/974f0d95a0aac4d970f8d1419a8cd51a19b54e b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/58/974f0d95a0aac4d970f8d1419a8cd51a19b54e new file mode 100644 index 0000000000000000000000000000000000000000..693058501cc11407c3414742e68e15a6f9f8d17f GIT binary patch literal 79 zcmV-V0I>gf0V^p=O;s>6XD~4U0)?!^vP1^S6C3zFIJ*8b-&(g?poi<>=fvI_5b2`S l;{4L06WiT`_Ff%bxD9F#%tH{k^P?i4rGo#tOqE+9s^erQ|&NCmK m<0b|`pio?t%;5h;(=AI&;H!CwMNm$w;5iod`!WD;YZ#24o+ViT literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/59/9ee8c973ca27b36118a7abfd49753bfa20748a b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/59/9ee8c973ca27b36118a7abfd49753bfa20748a new file mode 100644 index 0000000000000000000000000000000000000000..1a680ec3d918639e89b41941e0040864af98e887 GIT binary patch literal 900 zcmV-~1AF{<0i{)8Z`(Ey-B;^Z9E5&wI+xB`3}_P!h?6F$vCIZ+w?#4R10|nit}>~S zR1_n~fA6ED#c~5Q!DbkSNZq}=_ui3C3X{<5<6qzXG=3S;OS&-S&Z>OlvH8oJSNM5H ze#2z2skAIeR(@kF*4>j6NDGO_g4=ZIULXOp)8Y8PO-UP8m(F#W4*7YTUhw zk4^)`&Q!FOJJQBeFGq%@^wTNX;{l&MyJ)70ruLMQa4!!U`L2$x7G zcVx1DAW7dfP2scgzH}$!ab4F!HZ2Qd^KsDb*0CXQ?*~9PsVSZ; zX}XN*e6pM_M*-yXboF8WaYdgei^XKNnqDqxzMzZw?EQ2#ozJkkqRH$F{XU(&9}z<{ zxWl)l4GdtT3VQOo5pT&s^asZ%!~3vyC8sJ=DX8hZk~vduZrExtqLS@ax!|iqgX_>z zp|;9P-)!xtq36;#ilFn?0JP?_7FVp4fi2UicOJv;rAEGqtSsxe+Hn|3Dc&;+HP zPQl4DsnMCrE6W|gIk27!f?UtHzR&d>BK)v$&51~qUiXt0n0j{p4@^81{SWERU!WCh zih}Kv=_!U&d$B;p6=PJThq}>OtKWC@qq0hH2q`TjW_x92$~|%DE{Xf8>h)Z zkMRE@`i=xyu8f^0e{<@Gs7XIlJl?2yL~YuGLW4nPTf9-@7-8-yx77dks)z8<2b_8& a3Hl8J9*UwKOM¥¿·`wŠ^ +ÉKàÎs÷dÁ<òZ¤( fàd†º…O ÛU&p‹Ú%áœÁȳ»Òp<÷r°ç HeÁ$a %R¬, ©ÚW¥à2E¨…ݵ÷t,^ Üw*±œÚ9ªTÞon;Ñà;k+ón:­ëšñV2Sº˜–GCfz-–«xyJ²;Ø,ÑÐøÍ M–“xE²RžØ’×m>…FªYåe×ZX!‹ •ÛškôZ3a¬‰³¤Ö¹òÞo Ü¸„aCá2Œ£xâIî¢í‡õÍîÂÍ&\m£e ë ,Ö««h­Wtzáê>F«« eFÓÁC¥½£ðybÖ†£ý×Ä §º?› +S‘‹”¬ÉÂñ¡P¨%9‚ +õ^?WC3/©{a¹m_ýÞ†Þ”¦A@9?x¢ ÷j¤BiKz +f*M¼¹æ{¬•~`‰R–Ýaö´Û¦Âù‹ZU•*™‹ÂidqK{Id=¢—I'JÚçÞƒ^ Ï2¤¥r“hóRØwçJ¶”~G>Óã'­ Y¿ø¯²àâ¯Î r m¤%§Áy‚EëíJ˜Ô£éiƒA0èúŸD +Jdôq 9Šiçdñå+p]˜1µk8ªè‘tGÏ_ÅZ=c" XÉèßI±x¹¹½^nÇL;9joƒ§ x +~£PŽ \ No newline at end of file diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/5a/3ebafc7eaa5e8c40ca7368a4380b876b7223ca b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/5a/3ebafc7eaa5e8c40ca7368a4380b876b7223ca new file mode 100644 index 0000000000000000000000000000000000000000..744d187ac4b7f62d718bca221d333c205b68d3e9 GIT binary patch literal 115 zcmV-(0F3{50V^p=O;s>7Fk&z?FfcPQQ3!H%bn$i7%S~Zm_&9f!mzlDrJo|1wAM+GN z$;+%Kpo$9ebM-26a~LjeERz-dB;oxr(X_2%fmvU5W*?u40T3t@7bP3 zvN80(?2B}9) z!d7y0>LIqeg%#g|(hgdSgdr?cLL%U%z{Y`4Q0P@71y=<^C)~346Hq)8_z*C3?l>Li zWYBCuSNjKnyFeQJ-_p6pz8a0Xu4BBX%(SUTatO$d-b^Q#v+VLI(GF(sl|*a7;Kx=N z3OU~bZ-`dGb0RBw*XO4;NPA9u+MN+jsQMVJu3X0rdak9g&WOBq2U!cz0L8w4fbzx_ zB;yRGSpw(dY?>W=keliC)%^W6+>95C@$7nfnZbMkllkmodOe-b=<79%XCL6#>FnYd zka9-V!A)a)1XM=h^ND4jybOKP?{V$L$6t}#PhM^>dxziU_FZoOtK6uqZ@q4*P3>tMljyZ^@F!pM z4YO$05*_n%fL+l~My)~Oy+21ohbeTG6dShO`lj8mLMz|A%ws6(e8v^ctzPx)YB)2| zs};4xJr0c(W*b9oQyIR(PMcenBUhGHyl~oV_d&+3)14nLr#re|HP_lP8p@jZRHAMT zvP}))8N4w3KK_NM{G^*a2Z9D&YZP5k!uDf>LS$k8K}0)DlP`h8M!Gk0 zC~y7fIq(+NSdDI4ru0;LfO^G+{L+hGeT4n6y~7OUyGubR+MtAk0(%uiXNQ9>t+Mhc|DTXC?q!NeZY-2vP_6nAL)N{vloBlmPU8rRkmoA6Dz#z-<34s l(&QbzZ4{RNDH_}!%3v2s$mJd5*CFORx}>X5@!yL4&j)#bs<*i+!th<2w-o?< CzY)Fw literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/5d/0bc4781d05d90f3cbea3a0b21e8470a0f9aafa b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/5d/0bc4781d05d90f3cbea3a0b21e8470a0f9aafa new file mode 100644 index 0000000000000000000000000000000000000000..94d859a4a235cc4344eebbf91f9f9957cebce507 GIT binary patch literal 74 zcmV-Q0JZ;k0V^p=O;s>6VlXiP0)@naf?@`ZY1=40V^p=O;s>7Fk&z?FfcPQQ3!H%bn$i7%S~aJzd(G$@9SS3Iu?rD{5dC# zZ(-BhzfeU5`MG)(xj76fVR!dL1g5Hd((tfq-Ec;)pksZvi2)EO6c;5k+`7jdx8#MZ WV$8h7`~Ek~FUmiBQ4|0f!Yx-pj5IF* literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/5f/bdd0e0606a0abea222a56af0d4b72f22445a07 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/5f/bdd0e0606a0abea222a56af0d4b72f22445a07 new file mode 100644 index 0000000000000000000000000000000000000000..f7c3a68cad8c0d2622de1328c28e7510117787cf GIT binary patch literal 46 zcmV+}0MY+=0V^p=O;s>9WH2!R0)>>++6VlXiP0)^bf%shts?LR#xv)Oo^oBUj8{=aPL^Z%FrhDevB h7MCz=KQ%$kfY<)+tWS}_=^NH>zB4iP5&*#`9$YqvB6VlXiP0)^bf%sd9yuh}os>?-g5t?<9clHhRP=J-)&h;&J6 gaS4N`hVkP6v%jv;oc3n#tbS#=?fIFy0G?(XN?fKWT>t<8 literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/62/7ff09e191ebbfdb60a2b0d07448285d4ffbf4e b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/62/7ff09e191ebbfdb60a2b0d07448285d4ffbf4e new file mode 100644 index 0000000000000000000000000000000000000000..34072a82250aa1ecab28c29802027b2b9b8a9a92 GIT binary patch literal 77 zcmV-T0J8sh0V^p=O;s>6U@$Z=Ff%bx2rfy?OG(Vh&r5aA$xO{FaV#jv$xKcx$;{8w j%StRuWC(7UsJ}by>;CIc?caqiNUmKacXBEKE!7)-pvob9 literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/62/dba8d7454e83c79601994ce30f3a796664bad4 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/62/dba8d7454e83c79601994ce30f3a796664bad4 new file mode 100644 index 0000000000000000000000000000000000000000..33993ddc3cc63b758707053ed15ca04df5de56f2 GIT binary patch literal 1052 zcmV+%1mpX70lik+Zrer>?W_0|Q$ERwvP#?lMdG%wtV<%q5e-qUk-h{gazt%I?J~Pd z(?pSf?<`4KqLnIjfYuK(FLOC_=FBXYsanG6&o5v6(0}5=6Bw$j)FN41IDP)&r)Tu@ z3hWv|(L*753Ou)KrRl!8GK}1u=cR~H8jK;AG3v@`knxCon>Ri99kmfk!YO+WT^H4F zUil|yE<~wv*zgjhvXC337{b6xqzHHyVP-){h}0%a1(y**A?&)!(?oGd;6oEbEiET= zP7YZKYPD|&+%}-W{jIId%-JYY=Op}9X{5%l&IM}mp4>N z+tFm20If9NV4?IUwnQ!sTk*&$T{137Ruw2V$gL_|<5~$0+?BG-5)2k8Y4Ogouu5=2 z&kxW&)|uVlax8C!R&s-~UFko^Dsagn>XxkenG?7LQvbNcZwL*Z+pA%P=X*l9QC3D+WW(*%W1_mTWpC*xq_*bfD1yqC=*mc? zIF?q}@~C~)_C3Xngth|Buol9%UAKy?sg_g|;LaZIe;({^M0JUyyT~0WZs! zwC~wM@S29J5Yfg zn!sC9JGk)s@~2(An+2*xVsT*8rBjCDJ68%+7jUaY3?h+=w!sy*mX_Lkx6NeIJt6d+ zPFpm;gtV|_@|#PSr@-gKG?~c{kX32jO1fw4*`i__j6_<~u#2qpui}m+X)7C*HjejEsM@`?@ ze6{+|2nrY1lgT3)dN8e1+K0^sZ}_Q|>XuR0e_-rBX9_y)60l{4ey`%98lD3~NxP1| W@93NDKK`h^CmLaY@%{#izR1n*JQMc- literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/62/e27f2ef3f1f71f6662d2dc71c38cca37d2a455 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/62/e27f2ef3f1f71f6662d2dc71c38cca37d2a455 new file mode 100644 index 0000000000000000000000000000000000000000..0e2df12c07687d3f2b2ca232973546e1581da394 GIT binary patch literal 80 zcmV-W0I&ae0V^p=O;s>6XD~4U0)?df{F365qQn9Qd#2sDTFv_As#aXjzPSC;-5K9` mcp++1QgibeO1_-k*KlLi+=;D+p84Imp5@p*O%MP?Vjz(ur711| literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/63/123e5ba7d9b6d7113c7f3a5260f833a40e9043 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/63/123e5ba7d9b6d7113c7f3a5260f833a40e9043 new file mode 100644 index 0000000000000000000000000000000000000000..5e7eb44650986a102d52b0e4d7fa7a2fb931a431 GIT binary patch literal 171 zcmV;c095~Y0bP&13IZ_@gstx>EUa@s_;cg|1Y5<%ZjGZC+}ng?RYZJu6}`r4VEAU3 z*>l*Bn`S!7NLM5iLsHvTZC&J;yqpZh$lj6qAV#Q%&AyL}0+)m{882B$91Mdp))3r? zSEBE>k8a?C9I~yeA>i0U)FhmI)^uM&T{rLpJ^O<{+q}azu{q#K7uH=6*iJRtvgF{1 ZyO7mR9=}!J7mIoQEWb`!yZ|D?Rp@~eR5btq literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/63/c4fc59088e2b8b61068c8504bee44588c1ed33 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/63/c4fc59088e2b8b61068c8504bee44588c1ed33 new file mode 100644 index 0000000000000000000000000000000000000000..763e645549d927eac2c7a3e624f70b0c305ecb0e GIT binary patch literal 46 zcmb6U@$Z=Ff%bxa4juL%}#X7EGjN>EGWpyOinDx%+Cu+EiNh6 i%StRuWbpV>YI@MXmbo!_T}!Lfo>K`)NtOT=G#KIhSsgb3 literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/66/3871ead7de37140d3b877d68fa1f502fdaa22b b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/66/3871ead7de37140d3b877d68fa1f502fdaa22b new file mode 100644 index 0000000000000000000000000000000000000000..1b95c175c7e242d6703f0f7f68184fac1770ab79 GIT binary patch literal 46 zcmV+}0MY+=0V^p=O;s>9WH2!R0)>>++¼ÿ;{1{YL‰Òò†•Z˜ó;Ã/fkÕ9Æ»Ý.ß=Ë¥^ã§óùþtu¹(7¬¡ÆRQ²Y°ê-zËDN˜·»~{…Ÿçs¸{:™ p~n¼‡KYRëãêîúº%ráAîL63EëY1FV¬þˆþˆàÁÞ@k-[õ¦*€]n”QVš6l'õ6/kÙV¹¡ªÁ FT[¾¢¥»`“yh ÙŠñµÈX«Ù–œ€Á´KDñëçÔ2ï¶¿€ý¶t !7T|¿t ˆò„Û= à3¥æÊ‰]¼fD1ß+©ÑÂG:¾§Pw“¢š Š>¬ÖRJ›ª4&“ÃdP3Ú2¿Ý+ô4‡ZÍÿøðæòu¶øïÕõâß·ïSy&D³ªç–]S»Á"² ÕRn[…‚o´Ò²Aš)i¸•z²Ì(y]4ÄþŠ +ºfM¤Z±î€3ã¸; #Ô¯VÃÄ@ð”Bšý¬÷ wêf±$N¨§Ý+V(Ùì¿\ìbJ »¼QRC–Âʳ‚t§´\úÄ“D®04ø„VÅ ’/[^CÛÈV—ì¯nÒ~ЀòaÊŒc\…ÝÐ[»¡8Ë_<ØqTºúfLìx¹9ª˜Q¸¯‚$|Xû°}•«º…®ë²]Æ¡ÂÌ–+ÕrÛ 7þnZcE–Á?1mÍž„ZsÒ'Y÷³Ë¥¬³ày$ߥ+¾nµáf` ÷V·0‰ügH+>Æ‚È>~O¥ûv\îÂçAŽ“½¿ïÁ±xÔèŠÜƒNß±å!Í´¬|¤}H'D0Ò\©ÊiÆûi#˜]Õü®Ë0°9tú +Høçâ»Fòír•{BᬙK–~@uõ7N†~£Ë-ïßM#¨2iaìÁ¦HþÅZ„iqÜ=dÐO­®‹øcÀyîÞíœKÝì@Þ]Ü +í6VlXiP0)^bf%shsvS04Sy5TDg?ZTYG{*Go5Uw-a5)50NfO hEiPfu7QcC!6WiT`_Ff%bx2rfy?OG(Vh&r5aA$xO{FaV#jv$xKcx$;{6S oNi8lZ*2_vPOJoq?$=S7H(yVA3%}MQ!YgtaMe809B0F<>Gu^EFS5C8xG literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/6a/5849d491f72d0d0e19c59b82910d2818cbf319 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/6a/5849d491f72d0d0e19c59b82910d2818cbf319 new file mode 100644 index 0000000000000000000000000000000000000000..74f7476f9b4a5d2abe04012853e8fcf384b153a6 GIT binary patch literal 80 zcmV-W0I&ae0V^p=O;s>6XD~4U0)?!^vP6c15B9IUc=vtD+=)NmU2E9?q&y%s6Cz!d mTAW{6l$=`3z~K3OTG1ZWkD&>>OG7qZ%dK2{P!#~h^C9Pm`6WOA literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/6a/ac795533ced5075a9dc23e26dd8bfdc3303dff b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/6a/ac795533ced5075a9dc23e26dd8bfdc3303dff new file mode 100644 index 0000000000000000000000000000000000000000..736fb96966cd471c9a9e770e088e6aef0e4b858d GIT binary patch literal 645 zcmV;00($*;0gY7eZ__XkdDw3Gu;6E~&M|4rgas zh4#O5PQxfn0`j4$?YnpHy*nqZObW-xZ{NHMrvXgi+%#KK<;KCu(edj;{&@#(gJ5`5 zX<316-Nq2FhksUZn$Nsa8ET6;v^q!XlcGjuoI9M%;0DPmqv1px!NjAEhokYq+(T?l z3$@&WHV#^gjG-(PszSiW3>ybZLuTrxQc`CKopPJL&Vb^Xz}xAqn3qxgC?F8BIDn7qlB$tOwdq}(16m;G)nk(x_rLFtTwLuNA_Wc0%O==iN3B<`5&Y~nv zW*+1=UVmC%ui-XYt)j&`zD!`bg7f9#B3{SK1+P9rw77%M@#10z$ewX`@UbDUfZM3N zpP2XNCFo6m?idt&?$@@#Ocg3)X}WA>iBOscB+ZJTL8_JYeYH$5_mnDCD<@sQ^=lgT zx)cTh`+V<#a;(if2$+Q-$9zg*8)DpoWR0DndyyLBMAC0YJCi-~{GTa2sU|bJP-ROv z0Gu(_|AJ(dX>-8{4j-L=Gm?;+hqIR^R#>oyn}i1p|H|ek#9r&hr)Bft54wvde zJ|HApBsMV&PIsFBpd2)9%7X@3CAoh$Qmd+xdy?RL5R8Tx>zQWoU{uccO6f_$)u*dSR@fR!?5yioW1%mpKncPh95I%i!0(6VJt0t=9c@U_6a9*_9)7EotD@ f;Rlv#9o7Pggm15_^kh8skN+O{3Qxfg6W-v4`FgG<-h$=13an8?6%S?C4EKbfZOD(E&EGWpyOinDx m%+J%yN-Rrch}gf0V^p=O;s>6XD~4U0)?!^vP6bu?p>9<%gy?)F>hxQVKemEZ}506M7k)o lIKQ+gIklL6WiT`_Ff%bxD9F#%tH{k^uq_IIp6o32$l2B;?z*&bQkBNT n*(L@+pio?t%&?@7`+1egkECGpRSfI7Os5O?$tVE;Z5tT0)nO)t literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/6c/db973f7dad5ef98087b0ae81661d5ac7e87dd1 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/6c/db973f7dad5ef98087b0ae81661d5ac7e87dd1 new file mode 100644 index 0000000000000000000000000000000000000000..04c1ecd1350e88722e2ff6c4c2abe8160f0f55a9 GIT binary patch literal 1003 zcmV(i)m}}`i?a#hZKZ0_ zF0LjYKm3L-CNIk|)kfX%$|10B?d95vtI5(ieM!h_wJKK63uPAM+1c4S`RnF-S}l3Q zuxPDgZN(??)^MX?54Ts zvjqfH-Z4YT$x&$8bG68JXT6_Q~!=;hPMvb ze4445QZ8rc5JlbwgIX2_+^7Z_u9X!|nGM3&ivoCzhypK~w>1>Q=7zOw!J7oN=KX=- z)?@b+CeyHfnvEcaEjqwMCWJiqc<>Bw?eYQFk|0h{jE~c8G%vMkC<$La_7Sy}f?d&Q zWgts&6;MICb67t8Tfno8EsDG_4ETgHhyKz z1#v(rF>A{jbXs_^zS3HX*d-u#FQ4AR-?(EBELBf=UR+SJwG*5Mea8YFOn*0=w<}RC z_cWI0W-t%B$pGitNem3sZK7gQyExidwgqxjAE{zm?&eagLvz{HNuDSF`mS7`>~edx zdq}HW#p}2Q9c6-sCzHzJ*`TqV$g*YN4Tubi2|;VwLA&b|)*nH;CzfAki-Z Z_zlbT0G`xQ2Q>zf4u50H@n?uXcNAkh@eu$3 literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/6d/7a0de1943be4ac21fd4807b12617d9f7cf8ca7 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/6d/7a0de1943be4ac21fd4807b12617d9f7cf8ca7 new file mode 100644 index 0000000000000000000000000000000000000000..906815d50603e8780ecf9994a6daf60452688e54 GIT binary patch literal 79 zcmV-V0I>gf0V^p=O;s>6XD~4U0)?!^vP1^m3o>8g!V1*b9zEHY>ht>9VXs&zh;&hE laeir0a%wR{N6^k|4)=dQW^W94c%;t#eqY+v4geAX9@7`uB3A$a literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/6d/c5c50f5bdbe30104dd0a28c575bd508822bb66 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/6d/c5c50f5bdbe30104dd0a28c575bd508822bb66 new file mode 100644 index 0000000000000000000000000000000000000000..d98592c941411039c4bdbf5eeebb85225de0a49d GIT binary patch literal 779 zcmV+m1N8iO0hLtSZrVT)?JNF@5l_n-G;Oyi1r+2+$500U)vQmp=Y2p0z?EMLSK7(B%C^{69 zr@(W&RGRkn$}nbm?oTILs{EWxsTiQT zu;L|1Wg$06F@%AIND=TM#>|3{5UW*|3NB-WLfB=Mr;g%~z+D|fMV6B}Cx@&Awb(TT zZfnrseoJdJ^QG4-ih}V9GE+L~rJI6G?_Q7GWYPtr7PjCT9oD%pR*NXN4c6*vfNI}0Al|rywjV+ew&B_j zgRtv@%!28+@$D35{$%2hrok|T@dWzg(IA)x;}Pw?f_1R3g;FiuxP0Ot-;DptaBTOB=j z!;VTl&m*4iU7$Ix)P?5}3Z*UKN!XuU3d^Qw?8V`+&ZR`nCb^tZB~3?@X#%v+e1(P5 z_bfs#4O{ToDqS)zsjVtd%+IYVoN$c<2kuH)W(fw1m9+R^Sy&~wrt<@IZ*^ufjD~V8 zw2~{7%}V!U#i`2YEGCttWz-U}3n9Mp$J1?dmO2D{^*t9SCg& zn*N5aR{=G6trY)I(@WBl!q3VYCtAGI8NM;7E#uYSROd*xS9L>lHWF=O5M^X^l6*@;S!o!FnUIV@sHm>$CGInGOeh?U0Gz<#$4k)-)e!nKYn}F9OgC@}>c@oU6_M^HtSvKacgd~QIxwznXtKW4J2cc=kDmAF J{RbJlM6qGYgNpzF literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/6e/452327e0328b29415cb2020b3db6ef5346b966 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/6e/452327e0328b29415cb2020b3db6ef5346b966 new file mode 100644 index 0000000000000000000000000000000000000000..543bc100a5b09038c4ca647a8ec49c0354400607 GIT binary patch literal 75 zcmV-R0JQ&j0V^p=O;s>6VlXiP0)^bf%shtU+V=Nj?ru)eRK8#GqUGqn-S?ZWLZnMl hi%S>^Uf-Q_=kAp~YEN9=i8xIC**$;LSpe^7Ajx2HCO7~9 literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/6e/7433a4d834cde4968e648e239074ac2ab01eba b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/6e/7433a4d834cde4968e648e239074ac2ab01eba new file mode 100644 index 0000000000000000000000000000000000000000..8eedf39eae3bf920fd3de1f7c23b6fc18e8c022f GIT binary patch literal 79 zcmV-V0I>gf0V^p=O;s>6XD~4U0)?!^vP6caJ>i-=vr~Btvzk}5Jv%2~Xna%wB3+bP loL^d$oLbDV{`uOMR#gHlY_&C6U@$Z=Ff%bx2rfy?OG(Vh&r5aA$xO{FaV#jv$xKcx$;{8w j%StRuWZ1r3Y!O@V!=r1;mAaCrZtWH5cKitdAATAor5z!o literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/6f/9bcef519991efbd2a1edf823b6b1e4ea7c6a36 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/6f/9bcef519991efbd2a1edf823b6b1e4ea7c6a36 new file mode 100644 index 0000000000000000000000000000000000000000..36c097ffe892e7a588ec0ad67fb5f167700dc047 GIT binary patch literal 46 zcmb9WH2!R0)?!^vP1^)iA{m!mzXlnmaSR7?@D5VQ;qvv0Qpr8 Eq?k1m;s5{u literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/70/8824c87cc9701e1dc8afc46dd90d9d6371265a b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/70/8824c87cc9701e1dc8afc46dd90d9d6371265a new file mode 100644 index 0000000000000000000000000000000000000000..2b043d1bdde7f235796de5f865a65f8e924f864e GIT binary patch literal 46 zcmV+}0MY+=0V^p=O;s>9WH2!R0)>>++6VlXiP0)^bf%shsy2+u1Mzw7eyNgkcuG?79xPE?AQDCtBt)=G5z@t069JyW}bN>H2?qr literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/70/ebdd9cdcddd4bc26e444ee144095f98b9fb2cd b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/70/ebdd9cdcddd4bc26e444ee144095f98b9fb2cd new file mode 100644 index 0000000000000000000000000000000000000000..1e1a2f06d4408ddc57816a21fd6583e1d35ccec7 GIT binary patch literal 79 zcmV-V0I>gf0V^p=O;s>6XD~4U0)?!^vP6a})BNU0CdjfKkMx+c7G-NO|FfcPQQAo*8&Q2}TP0r6P$S+RStIW+|kP5!`KrVld zeB1JjOU!0_JT9-lvI(lXAU{{H0;uHtyxapJLA`0dw>p=+NvXXlz_sJPi2)EO6c;5k e%+Sg?{QUREb%hOrEB5Kif6MseQwac*=rKNU4?A!G literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/73/58c382cc26de8c5fd2e60b1c771d7da5121d56 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/73/58c382cc26de8c5fd2e60b1c771d7da5121d56 new file mode 100644 index 0000000000000000000000000000000000000000..52305f0c44cca359f810cf7b517861c046b90591 GIT binary patch literal 607 zcmV-l0-*hP0gY43Zrd;r?A7{;g-=P~P)T|yT3;+XE-EyzfyikP6g^PXN+u$aDj!jd zAphQ_EVOnDwADcn$(_;6EH|%p4wsh~@7}~`5uCw7w>u-Nt%IwJ%eUwBdJk@kplMSo zUIX`Ts|~G(FUtrPkT+7GvRHsu1)3g|v|JE&IGMl~G*)T_SL^~#0_%7<8lO%B#ZG%@ z_zskI;4Kn|v{1?#0iOl74x|F1o3@r*34~6%ZU3KvB`AT1fkWqxQ#mIJ&e6-GV9;7f>x|63J4$VE1LXa%fO6vs#z_WgHimhUrP(Bq z+^3sQ>$?ryC%3oBYLhNASl_~8y}C{}>3T)0kC3b$;B&gVo&Zv2)E#_oO>jVMlp#+n z`tULgq5td{lyn}}wnZUJDae|tJg*Qc{e(u5BWTey(uTfT5?BODwQQv0uHX7~8xFb@ zM-k=x7>EjN^fZb{g*J}#RLr)9cuT_@?6i4gxz>(l{bsTcIWSNE389;+g;u4kyupEB zPF(*>B5LgmMjb-lFs|rQ_LkUEg)YyfDoEyEWgIaylsBgts#vDI5lE)vvwm`B!%SWC zCxmQ=hBAz!+1~PRilf=l?@#tzOw`=k)2Q`1T|($rkoC&v-X0i+mna$yRW|q$@T6ry tQzz940Z880Z@^7uPpNb?`XhE`d|ybJ95e4FO!nAmG8V=y!@Ff%bx2usY%%*jb~EGWpyOinDx%+Cu+EiNh6%StRu eWH3#N<92au&1|N_B literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/74/f4cdbe80d8aa9d9185c2e64edcd76a418b9611 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/74/f4cdbe80d8aa9d9185c2e64edcd76a418b9611 new file mode 100644 index 0000000000000000000000000000000000000000..dac81006cf3790c500f4d9d4604796e039b60c7e GIT binary patch literal 77 zcmV-T0J8sh0V^p=O;s>6U@$Z=Ff%bx2rfy?OG(Vh&r5aA$xO{FaV#jv$xKcx$;{8w j%StRuWN;MJnRJk~@51o|^Ar`MzrTyPFi#c$73mr9n0_IG literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/75/040ca5a5a69bffb3fcc4ad55dc122102681d4f b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/75/040ca5a5a69bffb3fcc4ad55dc122102681d4f new file mode 100644 index 0000000000000000000000000000000000000000..561d321787f3c7dff7dbc1cebff3faf1a6b7d996 GIT binary patch literal 73 zcmV-P0Ji^l0V^p=O;s>8V=y!@Ff%bx@Te>YiGo6gO@H1ct02ZPCVn-56OX=#`RYcWHA;m8ACJ zU*F+F@;;=sQ}mDmKCC$3JieLX3|$CSB(KMB#@}V{)(ep=K^v~*<>*y99wi`4RdG4H z9DTm~oxB~r%TKdft9vMIf@o=GN91l&)5*boFzp^o*X5$FJyLH`kML4hu%O zG?vK{MnS97Sg<9?l+_GjUhnqf4Sk)C(f8@eNrJ{NjJI&DN@jgr(buqM;t&SIIe@H9 z6%L7ak>d9#KRwA7ssiyP5YN3RqdRAashI|85q*-)v})?BDo38FsWql&s@VcoNhIQHMO08&AzH}x@~2CFy2h74$I zujk~xi3h2Kn1dw(jfMx-XD~>PP>X;m*QS?IluNaO;)sJ`N>ku7*{A6R1lSC(Xc%6W z`<^)h9^@H}%{Q1YzV0*dyoj*H-@RQU!A=EV6T`9ctha81=~1k)^K+tkQK;T5M8IRy zh`z9cBDUO=HNuim^&`OHPA~#6ls;9=8L$N@`Y(rVbipO`DMry?;+8lDgy`+dM_xbh z-h>Qg!ktI{q~fMjc!hfJma$OWf>F!i@PbAtWkots%cYvA9l~1j~D?!g&crZ*(_M z-J$cFTisw`{Lc^&J;dV1cnWzp{C0=BEgK&QVWCIHJ6jfg9z<^NKH}tnuZ*3`QZ%?} zLPF4RJjl<^=$T(!={;Lw-?ZnR9Io9x#SGSahT?%U^uBPjv$SW?Rx4_4?dfI)X9p~9 zwW>ke%@?LQE8=ePwRRDu2FgZryGdbIyAkDXu;yE4Q8xVZq@^<|S-p(>bsT zEt^=r!}B)8qakI_)Vi&^Z)VzdGrnbNWw=$E$GzDdYWVM;&I>p5Mo3Q)d zm^_Kw9lpE7o#m%3P6aOvX>AgLuT7kI;mP3oxwRH=2}qazD(0yDa+$$~-^ONim%$Um z140Wdn6XO20Hd2N`O7JFR$t6%%7npt``?hl$0;x~MCnr}eG#E(>;-lCY7Sd<3auAs z(Wm`}48x~8KB!_>{cpT2`*`egJ|NdM)Bm7F{}sV+xLterv_rJ(M&G)48va4gPyYer G!bXLPjzCcW literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/79/5ddee6045c6c6b66998a61890480bb0f84e6b4 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/79/5ddee6045c6c6b66998a61890480bb0f84e6b4 new file mode 100644 index 0000000000000000000000000000000000000000..8bd2d529aa1baf1e8ca950403809ac141156cd95 GIT binary patch literal 1015 zcmV835>b-Y-kh7CmC2Kz|MW0|`$sgjfx zqu77%3`O7Krk4OoBylch&deMxO0$65+qXC0^{-R7hM}o;RuyXxw>NKpctd}F0>4Hu z^igS9f~@`8SbC37PLLaWPE?NC;Sy@SL>rt2mCVUEp7h{%v`!ffx8er69JLdVI#+ib zVrOdD$Q@|op>{|yl!KKj5%4+3%7fC7n@v?JsdI!z`E|$>qc9Tq9AlV;mt-!-U?c5i&p)#uojuEy(pJbp&w9kV>^t zUi$FqI1MLV>Zd93{FMWFbp9?)35Bs9zR0Z5I4u~OWYVSHU0?~gO+HHez$j{ zcI`Vy^RXc)qBI2!Y#}D5_>X2EWbTdKomqdWwen&fFh+=+tNmrt)ZjqoU9-sY5j0;v?I_IUSmm;U>(q7Og=R7kz@vwgyhLe9R z;*}6A0>&wi%t`z7f1;ih6ngn%tZUEfey|*ODW^5r_k7?SS}$byH@7uX+wbE9bX$Jg z7*sbIU8VO&(wVTdsu!da5KiF$`eL-%*1?}?n%o~IBu%J)Tj}xW*HXwj(UQBTl-xqL zB&ORMMM^|54;fp_vCDY>v3o_ilH^!cxAP(<%TZ$uExgji3hS@mRoLl~TasKDM;p@J z*E&R!pM0bG=-x?4Gv=)IyebYBn9ElF5n6aJP&1Z*qAW={RnT^e^fg4%2JT0imH4IG zHEqu|3tBLyYbJ;vZfHKkG6HEV%Ux(rCH+OAH`A@Pa% zF_&Xb&Nn%9`q17Ojid`$#z?P!0eXo7B?|QP*1edSIC36WiT`_Ff%bxD9F#%tH{k^$V}l?m=p2*%Oc@P*XzO}CJDQk nGnyCxfkJUnGJ_>MhtR%f3p|^ry%TX%?+>du^|1f|X+;^>V*?_P literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/7c/75b6c86e3454e70c51abcb1152cfb9bba71d16 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/7c/75b6c86e3454e70c51abcb1152cfb9bba71d16 new file mode 100644 index 0000000000000000000000000000000000000000..2062d9b620161dfa289367211cb98b71dc5d98ab GIT binary patch literal 119 zcmV--0Eqv10V^p=O;s>7Fk&z?FfcbYRS0r*bn$i7%S~aZsgQ1JEIzTCA-2Ds-?%kY z@&->RP?4F5i9$hsu3klM4#UUC6VB<1T>UCDlh@-=gX|vlvymw#20)-tT$Ie9{&{Iv ZY4Pu1wF~uEB$v1dNKe|40ssN{C|}n}HDLe% literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/7d/2fd94b48fd9907168c90d5bd9400a5b6ebc5ad b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/7d/2fd94b48fd9907168c90d5bd9400a5b6ebc5ad new file mode 100644 index 0000000000000000000000000000000000000000..6920b483b042ba9ee827416508a24fdd186c2585 GIT binary patch literal 46 zcmV+}0MY+=0V^p=O;s>9WH2!R0)?!^vP1@(OPiM!8=A#!U-!dqzU4|c)qSV4005v5 E1b(*>_5c6? literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/7d/b28ad5103383fc58f064337914f5d9198ee53b b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/7d/b28ad5103383fc58f064337914f5d9198ee53b new file mode 100644 index 0000000000000000000000000000000000000000..06ab29fe0f6587a753e67a821d71da9627b772f7 GIT binary patch literal 1002 zcmV6Z0oibNY-48&4rfm%69mpLwDWK!b81{%?ODfnB5R=` zoPo)`F8m~RMQ}4?J^AB<;;j!Dy{yQ@<-RK$qxR0Vyj*OSY40o8&?^ zMWSh03r5ml37e=gd_{8u`}`j4OtCk`Uz$eXTvjW-#s$~81ornNjdp>LHY3>&Ut=@eh-*>pz37;>P>$A^zP~nUi|gT&EoC* zk1c)?=;Uvk?kQhgWB-?gqD&l8!n)ZWTSHSd)s<4 z*Li?=-*(1rtiW#R9Sv2Hoh9ca?af$|n7PjMPsLcZwdp$h@=x7avs(98gMr40f^`Q?`%&Y{z$E;Co zOQE@PsKIY0D%;+lHJGPo$}m0PBUH3s>+1PHL($O58g%Z;)5)tA4cszqbMu1}8rv}Z zqgr=&H};+nDYRYKo$re)`k&Z7uD85KP=P}3(T`@sHG=Q9(FRduAtSij8^K=qj&2)V z)LZ?ze)qBCC&XXbjdD*C4;)B^b2FnFcmcRy+ae*x)iKvafgvJO?$Q^?IU^~0cnzzz0k%GT}SJuL+ZSqjA=!MhGaeu zD0px%s*geX(5;>hsP*{Y!HH7lRY-iPeF%@Dpv{BnK|(trjOTOlttfO1$06ncxK3C9 Y1GSC-3=OEC)G18+_f|Ij7rG0*(j=AkZU6uP literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/7d/b90d5b8d1476acb720df185a9292ab331e3671 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/7d/b90d5b8d1476acb720df185a9292ab331e3671 new file mode 100644 index 00000000..2875b0ed --- /dev/null +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/7d/b90d5b8d1476acb720df185a9292ab331e3671 @@ -0,0 +1,3 @@ +x}”ßOÛ0Ç÷Úü§>*.ŒiÒÆKCÛiÑP*5eˆG'¹¤©ùi…øßwN"h@ZšÄ¾;¿Ÿ³V*…Ë«‹¯Ÿ¦gœÁ\Õ-Ê­…Ï—Wçô÷ ìAÑ ¼îìViúîß £4Ÿy+2”sp2GÝ&…5Ï(·Ÿ™ÀoÔF( ŸÙœøªã~j|zíK”ƒ?€TœAª! ¢BÀ}†µ!!S»º\f°Ûv¾ŠW} •ZNáœê¨â8¸íEƒÿm­­Í÷é´iÆ[ÉLérZu†Ìô6š/ãdyN²û´;Y¡1 ñ¯š,§à5ÉÊxJb+Þ´|J4g•—Ýha…,'`Ta®ÑkÍ…±Z¤Î¨õn€¼7.a&%c¸ “(™ø"÷Ñæçên÷ázÆ›h™Àj óU¼ˆ6Ñ*¦¯Æð+Š@bFÝÁ}­½j£ð<1oá%è¡¿v +š÷ߦÆL"#k²t¼D(ÕjIŽ F½Æ÷ÕÀÜKªÄNXnÛ¡·ÝpÔ¥içG_(ǺR¡´%=%û㤰lƒÆ^ÖNJÔlíä=9&šZ“ Bó6J?²¹4¬à™UúÀ¸¤mÕŠb¡³ªñ,ð!])Ë,É`™’÷–%í74þAÝûä¬R.gmQ‰=C§ñ‘³eûX“yz‡9q—C“ïË´Ë)_mšy'è¿òÊ[¦_z¾±3KvÄ>4µe¼}ÄÊÆ®ª(|ÖS?é8teXVQÜi0 fC©AíR:ÐFC¢óvÇïOÕÀsŒf¯- +Fý‰[ì“ÞÑ£‚DÊñéÞ-ô¤DNg¿mÜ­â¹99¥­¬Uc`Ù^&þ"zF£Kº•„!K¾&ÝI£— x þçöÌ \ No newline at end of file diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/7e/e7d5b098e9a83450c74593b3cdf9a214a631c7 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/7e/e7d5b098e9a83450c74593b3cdf9a214a631c7 new file mode 100644 index 0000000000000000000000000000000000000000..bbfa558960e43538eca6ead7061048e9c7cf7e19 GIT binary patch literal 74 zcmV-Q0JZ;k0V^p=O;s>6VlXiP0)^bf%shq{dF}k4PPHWe+r-G!e>iF8UON+Sh;&J6 gaR~!QGS}M#CkO3=%O_fWXSX=bH1%0C0CV&ja(}`fyZ`_I literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/7f/810bf6c1bae0094da57ce27cee853c2a0b4c74 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/7f/810bf6c1bae0094da57ce27cee853c2a0b4c74 new file mode 100644 index 0000000000000000000000000000000000000000..0baad8ae07305b5d04cf5e99f21e9f7909b4797a GIT binary patch literal 67 zcmV-J0KETr0V^p=O;s>8U@$Z=Ff%bxNGvGG$xKcx$;{8wD=5k@NG&SKOf6>cj|;hQ Z`|sLC_qWydwRLal3)Xz70svfa7yw#Q99IAU literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/80/74285cbd728cc9acab61849e56d1d8ae6cdfa9 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/80/74285cbd728cc9acab61849e56d1d8ae6cdfa9 new file mode 100644 index 0000000000000000000000000000000000000000..3b7cc6368f2afce4a76effe1b6f75707a877cf84 GIT binary patch literal 877 zcmV-z1CsoB0hLv4Z`(Ey-dF2a9E5$4JC|;|Va1wlh?_Ww(aat!r$P5+pyad6RVG!E zieeP`?|Ud|i=Av8X26#Da(BK zdy*AkdRmmGf3*wLem=XG7qAxBL; zca;qcV516p^12l-pwG$hedt>)PYV=!+R=k&GeO&WNs4-r6KoGgnp6|R!+vIOC z{{-3p4Hh??P4%s^M(Uh1!dNV2SUFVXE|BrV`p-T;eAM``R68`nX!V z7nv)#%v0@^-+yuckwUGZ-}OSlAo%p)j|)e26&bGA&(UCT?A4Dc?ipSDOlT5VhvMOC6^DQj zGZ=`1{e`ie!ATrk$GzAx-WuoM#Pm%U8K{n^%i6mD=7U4il84q37mMrm@@cDwB3;X! znKdUvP<|BoAB6!T1}MCb;!z8`V-@mVvc${BCBrbdf>XgojJ)ZvcGd2q=sx-rkGF46 DuCco9 literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/80/88eec3ed1a40ca8b4aebc988df41c9f5983e89 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/80/88eec3ed1a40ca8b4aebc988df41c9f5983e89 new file mode 100644 index 0000000000000000000000000000000000000000..a0ee0851100e495c165cbb58d171bbcf0ca83073 GIT binary patch literal 574 zcmV-E0>S-w0gY3^Zrd;n-8K3OBB!)S?KA@hY`N4;Qp{M90CBpa7^})zu=U_Uye0xE!_uzI2nhvGn zCGf`Ww4u2FvH`XE&RZ!^SnyHh1v3kJV6(valz0K6tzf~Q2b zJl6v-@@jKkvcJC`jC7 zf^Z<#%%s9~^QS|EIpi5jsn9e7D>ABTP`@N8Vw;l=e5Fb=DPS*r1A$}pn;`rrIMo^y{b`xPl9MHn5@n?% zL9v`vwLgWTcxI%NT`6XmC_12JZYrXv)0#1D6icjm;964+VC|a$=o=B>_hX1+ACCKR z6n7lSWi&ge=_NhrqM8l@dO6r(MdFo#v@#vLVt7xpQF)92Pk@m-Jy$8xeBn2 z%=t;P+Ps)L)7Kq?9M9camo#NLOR+RjSW-|Zk zr(vT@UC%?GuN_fF=d$N{s6r}(dWuk&3VCxy=CqRPI!vTAVO($aS0+2=-ajEYsWO!! zXN6U?Avi{^|0PMev{@*q$vInuzpUlqP`Czv!{2iy7t3cgR5S?_CbEzSoafq&aDoFv zwfTa>f+fBbeooMv7l5@HNMV%ZoGP^ZXyxf6OT42;MS4dQlzfl$N}J%ML&^yb(AtX) zSK+tkwVEjHDo^1?vJ9^_6G4mjiHY(r3= z!QmkY%Q<`i--iS6@!f_7whjJk|59WH2!R0)?!^vP1?8+s4E5eOJ7j?9F_8`SakntWsY%0sm7D E%&j&RS^xk5 literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/84/cc3f4746967802e002afaa29239e5f5cf9a8b8 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/84/cc3f4746967802e002afaa29239e5f5cf9a8b8 new file mode 100644 index 0000000000000000000000000000000000000000..5e59f0a54939d83b8e029733292dc224ac9eecec GIT binary patch literal 1004 zcmVo~TN`_MOkODd^$(iB2H;*$~NVPy0FE4)lhQ5AmBzoY+3e{fC&Wp1d;%%jB z(XOs$pFjPIU(H^ZQ>u-+?bl`ru%SqbaUbyA&(S4X}Ve-fw&4v3J6BG&;PBEwz#e1KaL#|i53dAhCUrB)3k;mhYf zp|(=6D;li~R4J|kDkygj%a?x#c($=akr#%6nD9IzL8+@0i%v**N~$vz|E2FfWoSOY zeC#}jZM?#QIN*sfYs(sRT6nR((OQbwJs@{4pWecI+_49iUQ&5pyrN`hCj<@pjt_S* z{mpRRZbY>nX)LeJU>3goChVw1tK%j^pzFOa`>U#HKu zz0spRB+{K%>$n90WlDxClf2^DAg;a4vSlC)7z|PgNo(0b&+A`WT%7RA#_1o;Ka3I_ zBaibZ*_AZ=p7^F>?}bKCTdB6_d$$%A!SAlK4l(2*BbYRuzb#z;RV=1<4{bb+ioBg-_kedKGkjHV;ajzkWs_K_NaEtC8g)9Q&9@;07`M46WH2-^Ff%bxaL&(5%S;bWEh@~ literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/86/9ff1cb27c20295c7d747ddc4a42f54db6ce1f8 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/86/9ff1cb27c20295c7d747ddc4a42f54db6ce1f8 new file mode 100644 index 0000000000000000000000000000000000000000..477a9472b456e980469c7cfbac6b040441569051 GIT binary patch literal 46 zcmV+}0MY+=0V^p=O;s>9WH2!R0)?!^vP6biCBKeI#|G^c&#pPv(wO=5zT@`200nUm E>zXGN;s5{u literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/86/a35cc5698f9f5f5e26790b8428baaf16f11bbe b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/86/a35cc5698f9f5f5e26790b8428baaf16f11bbe new file mode 100644 index 0000000000000000000000000000000000000000..1e2242b2e073180b9e45a607d002935eb5cfb074 GIT binary patch literal 75 zcmV-R0JQ&j0V^p=O;s>6VlXiP0)^bf%sd9a;*@=}*Vg|ze2yi*^uUkJH)JFpK%`4j hi%S@4^>2E6{GG`z)-&Pi-YE=Ax4k~P767?$9s%01A@~3Q literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/86/d61a366ccb18762a1342a6b9df7313bcfc1bda b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/86/d61a366ccb18762a1342a6b9df7313bcfc1bda new file mode 100644 index 0000000000000000000000000000000000000000..e3825cf036c9992a841fe16535b12cdd6ba3b34f GIT binary patch literal 67 zcmV-J0KETr0V^p=O;s>8U@$Z=Ff%bxNGvGG$xKcx$;{8wD=5k@NG&SKOf66XD~D{Ff%bxaL&(5%S;bWEh9WH2!R0)?!^vP1@bzTM8XtM629C|I($!T6SHQr^}G0Q!v% Ev!$;T#{d8T literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/88/341e604196fa20a93a3cf839625f6818cef430 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/88/341e604196fa20a93a3cf839625f6818cef430 new file mode 100644 index 0000000000000000000000000000000000000000..8f8c09f106b368f64403ce3be82fc90b08b6c9c0 GIT binary patch literal 790 zcmV+x1L^#D0i9IQPTMdP-D~p|SA8m|B(O;nTVI-%GODpwYRV9r_TV_TsYhyOwnL~U z{(aX;fOJD;S|6f1&OP_sbB-NnDu$Eyr>Ad%Lk|vNtn#fE>Dt2EeHY&CUDbWsMs?4oKZo(1+{8_ z2+TI5!Tr|O=H_D%lx69&in6bC8f5iACb*oAC$ngBM6{c-E197&pz&uRG>sf@f#pPt zvzW+ctgQ4&HPW6{j&`Yq6*BFEQ7c& zo&JNpKFO0Gm&XlwvRg!Qi=JX1yDbJA8?pN!;Av8_LmE+c1; z>v6Tem(31PrdSd)vVo)aFKIEV7yC7!IV|4Wws<2_b#L1eV?P!$X%{Uh@M!E83OiZ! zALYi5iHcTPhWgd=M!N-dTq32ES)`-{ht+j6Y%ZcGN2djR5^+q~3%p_N^&eJw!xx43 zh7SFilb07U9b@1bqtkJLS*B`-TCT${&+81I!sm4;TX)0_+C&M#8BcsW4Wx0Y<#4A& zLYJJ7y@<}fOuu~xrc-l3sGZJVG4*vJdoRDI2>x-e1qb{?PF?x><$ UUhZ;`SndeeYrr3V11=d-DsY*FTL1t6 literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/89/0196e16ebf8117619704a45007328746a7c731 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/89/0196e16ebf8117619704a45007328746a7c731 new file mode 100644 index 0000000000000000000000000000000000000000..508f00706e2edfe8f2972a080b2edfdb6915d3eb GIT binary patch literal 46 zcmV+}0MY+=0V^p=O;s>9WH2!R0)>>++gf0V^p=O;s>6XD~4U0)?!^vP1^vAhVJs^H^3++|YCQ+*f_cU$)x6A<{*u l#rdU0$*IK*44%)Y741>|7@DxVG-Tto+{(2FRRR1i9t?;|CJF!m literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/89/88c9719cd8499876c0bb9340d1cc39f10ed9c6 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/89/88c9719cd8499876c0bb9340d1cc39f10ed9c6 new file mode 100644 index 0000000000000000000000000000000000000000..4733bbfadd714071a949726eb2c24405bc33de33 GIT binary patch literal 292 zcmV+<0o(p~0c}w|Ps1<}WzMhg(3Lom5FegcJHSB2!h){$l^7h`@?Bb_D*qk3CQ^%- z?DKo~?w#M(g{`=G=&uZJrw`RoOxEX92#C>H4Qzuir4SxQRDzNC8F}aI_r@C3kQ&0Y z$5co$Bv#_S>-vT&c=6h0%7EZ_xSo<#VqlI+N*6S^ArPzF*-1)Tj$pk^NMTAEN!F(J zlY(y=oDzP)Nf?L@AsHp&?=26|&Z6gPxj3^LUz4k~5C(TJIerU1?^5PdHZWzLS{gf0V^p=O;s>6VlXr?Ff%bxaL&(5%S;bWEhy5-oG3NR>aL z7(@T}9VsPt&@~0JJOrlhzPs=4yCVys3OG7?_4=pmMFcNkuG+2U^~S={tDk>4#DA~B zZWt*1$R!m(o!uyn=i!$j2=mAfykyd_3Y@H%4xm{}OT-SA1Neh!!aiqVHkrOSaZRE-Ic7hz$KKbX$7aUWYBTD33-Mno(X&!VyMDWbf*Yt zx1iShjzH}|8vNhJ+SVLrS=V)h2FgU~Ium_CCi}3MpD*+CL!>>xuBBkcfM#DD*I06~ z1==F5k`_o-&@S|+)(mY{dD@-kmdpA8j9S}{YUa6C+*r*EXCHNKs0Oh1eFy9tl@QNz zSmZIB&GJQl;Dg*OuHLV%ui$2Oc{y8NEzWaTUBY~|e7m?>td@9s2eaiT_I4*E-2lyWJtT#Lvp<@LpxU2}3 zIJ}{Ba*5NyjQxleBIRep8SY#4T=WISPCWx`>|9B!l@Lt-5Z*Xpc}uk=AMby?!=?Qp z&M4bn^A-+*sR52VwkNXa(0S0mATA^qa zA3zg^6Q*#_Kb*;L=U3m*?=fjl>ItP`*h38Zgje6{wN}mCX^n&8CxG4A3u-qhJ|?@m zCmY*{(@CMK?P(lfFCm`b#nue$r%9`fO@PVLZd*1@9>zKIUWXO6Gyz)rTV$HthZtCr z)+c=E$e4uh>6loBW8ABOHDk(Tm)$Rie-`?d9K(dm)>-JY`{ynJKPuBC{NCXn`59N> zC7bk;O_S>&Npd;~q))xh@gxgXPqNU0_6VlXiP0)^bf%shsNTo2a=cC7HySl1xqpD^j7b9Q(nM7kuk gxP-xF!Qt(4cV_2YlfA_?yZ(91ls55N0Bdd=FS-LGGynhq literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/8b/7bac5cee91811657b1fbf1038054ccbe6cda12 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/8b/7bac5cee91811657b1fbf1038054ccbe6cda12 new file mode 100644 index 0000000000000000000000000000000000000000..4ddc9a0e52d1d1cf021bb34855863e8590d45fd5 GIT binary patch literal 46 zcmV+}0MY+=0V^p=O;s>9WH2!R0)?!^vP6c2<7GP{&lP>u_%pqtpRXjPH@VLj01B25 EL5tcF9smFU literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/8c/58d1f69a0e67824089fd0a982c3fc351839253 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/8c/58d1f69a0e67824089fd0a982c3fc351839253 new file mode 100644 index 0000000000000000000000000000000000000000..bbd3d3ebc26e02922a6aaf474bc3650d72573b1e GIT binary patch literal 83 zcmV-Z0IdIb0V^p=O;s>6XD~D{Ff%bxaL&(5%S;bWEhilo8++vRBOd?& literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/8c/b1d686e94588d64d9ba56f3d853922d669a7c9 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/8c/b1d686e94588d64d9ba56f3d853922d669a7c9 new file mode 100644 index 0000000000000000000000000000000000000000..6a64a8c4039c8a5863dc865857791ce8da1a973c GIT binary patch literal 46 zcmV+}0MY+=0V^p=O;s>9WH2!R0)>>++oca4Lh z{Cj7O+mhx`4i-B*@9leUCaYBj*B`Flg<}R|m??cQqS`vRym)_gPM>RVTLeW#A$bkF zaa(2R-2bxy!94O#)U8rbmz zNadihNF2gKDQX0K%27KI5^}ZEwcs*GXocH$@ANEQ2|V;1Ds!CLIRW$mRC(G6-1VZt z|F+I)`!NjLwheeEIZ&nw>!TqX-o>*;k}l3kb`QIkHChV>e>TF9i;WkR+bmB=i z@%qd1ehr&wwThB;yhvfWg4r^e$Ln~R(CHII$pd_illcUYGNb9>lQ!M~jZyeKvFO4} z(TDzLVo=h(KU~<$uFv@%Aw8g>V#scea{ggsy2)q6VlXiP0)^bf%shr$TaKK&7ni#tk?(~DL*diS;nK-H5b2WC g;u3~OXG27$mzbNpU4CVO8Rtp%Pu)5B0H19f9IQbi9{>OV literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/8f/b818a646b250477e4e3eac1ea66e55b8106538 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/8f/b818a646b250477e4e3eac1ea66e55b8106538 new file mode 100644 index 0000000000000000000000000000000000000000..338dba973c96843f821eb4f5993ce9b1ffe48831 GIT binary patch literal 46 zcmV+}0MY+=0V^p=O;s>9WH2!R0)>>++*>ËÉ&üÆÔøÛÖf! +…ïú \ No newline at end of file diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/92/e89353a12573455789b028b079b54c03dd4c87 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/92/e89353a12573455789b028b079b54c03dd4c87 new file mode 100644 index 0000000000000000000000000000000000000000..3fae1053db01acec8145f4b79811747cf1cbeb5a GIT binary patch literal 80 zcmV-W0I&ae0V^p=O;s>6XD~4U0)?!^vP6cYNA-H2KYo`_OS*KY@Nmy5^Gi!YA<{*u m#rdU0$*IK*lc!DD`@%J8*NkpvogNE^SBn>{z6k(t3Lu($cq8Ee literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/93/9c3ac54e2dd75545379c4875f036644e03e768 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/93/9c3ac54e2dd75545379c4875f036644e03e768 new file mode 100644 index 0000000000000000000000000000000000000000..f43ce9e0d312a473da7665282578155ef14dbf4d GIT binary patch literal 948 zcmV;l155mP0nJujZ__Xo<+c44rs4q}9B+&Vn7kmqLE2!VfOvHix6PKs#&*_Ki2u&D z9VbrH!6bx0nzY2Z*Y})rzq%;J0v#PbIl4oiURNc$;z}2yKA9aR2Q$R$OyotqI+=a` z^cp{&Jx!-nDsjOxgTT7h$Je?znXQeH$AoM)n`Cp82(=;)4-O8=*R#`kw&oSXMXe31 zGd}ZPokzv4c%3lGz|8rbe>fwLk^_i6olFp1eyrUMry^s<;c8>u?1`*}1~?;=Yn}T; z>_Q~)K1-()T8W&OUp(>DeWGM=HU*=V5{-P9r@$`JQh_K-#VWoL>N3en(d3C{l`J_W z!4jO9GR2Z*2K>AacBa^yVr>*>6<#!&lE@Ss+cc#2zQ=w^d;EivU;wtD-X&WBp!9+% zO8Qp|y9SKEjqQxUIOjT3g|tGaFL@W9`X==Xu*BWIx4{-@>WGxgr3C>@Z<2|*-A-C zD=<8Q0KCp&iiXnZ4z`Z&@2AS3Sq2iv>F(OatF$Y%ZPylvi`(P+OE6%fVOD*U{}70q zthP?EZln|n#!gh9w!QvDlyMQo)gRYT7-Sa8E(9p{3?@tJzxn4evIwXvqqwfNXRKx` zUWM7)<+&}ms04kge?6Yvb{dx4%{3Rt8Zqlf^etAH9Uf*2LP$|j;+}lhdr6AQ=dTlJ zoVz}ko_M6$KqAntoAjY4yMwkFif&o!nn}GD2G%niT1bAM&iyK!_n+Gh3I>fT)9?$# z-rW9JND4v1b(B~mcU?I0Gk8LI%@!rk+xZvXoN4Fomk=4k?rDu!R7DB3Cu)8JjkDq|o&E&Y(Jzl5Alb|S literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/93/9dc265a8bc24f1b4ac881f10aaac2016d298dc b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/93/9dc265a8bc24f1b4ac881f10aaac2016d298dc new file mode 100644 index 0000000000000000000000000000000000000000..601aef0a90b2f439a66c0fa42ca8928fc516e787 GIT binary patch literal 939 zcmV;c162HY0nJuhPunmQ-fR0SylM~ILt-wIhL8!`#x6)O&1fT8l%Bm&;|m+>g1O;k})mUHtR>Y@E(nNu#_{ znpPo^Zxfs%>12ulp^LK`02P2f0(3 z+l;J>7}ld?I3Oj@Sn1P4g4YqF5M`W2eR&Gv7CJpiyE-YuO$Jjo4} z1h1DS>Iy>qn`?^!Y{pb7b75poPFTs2&-9c_G`5t{N5hoh5Ng~ADp{pL%ZGI`d_#S< z31l!4REyM1M(*4Vb=LCi#Zaa3hwIa`lW6?y{pI-U#Z{=yfJjzA-7MH8)pML6@-m80 z!TD`1kUJYqB`=X=f~#C}xk6E7N&;kbj0`!+1%pH~WeGN_#FIKNAnCl8Df`s)Nn+as ztX+?6#~77v=z{umCcE(g!JQog*_Qd_i)5@?=IOl0dMn&A3Brf94cieZYA72^3P{?8 z*$3C4lDf?W%9tql3cc3zTp{?~)Jh|YG=o2Akh)-RoLPs2EU1xHT02vbOGT$7DQf$+zsD1;I>xnm0&mWMnzkMj>SFUhwlBek&@s> zV0Z)pSe3yH^`+BptSsFJXG%ZNP~k96-z-Zu*;LtdY7>KXxen>SL;#bnrqD%C8it*i zovG2OwXp8}+;~#||DFibADbaSWv4Jk68FwMn=bDrC|KH>35#fTPAfWNr606yW}E5? z>dhth;aR*z*86o0ef5~F=kX)1D>Etd3WN~6B-lQ=7I%{5rQj08YX#a=C|o<@fo2_v zK)ZIV`vz<`n)1)vds$Ufs5xB61jD8Y$=#h}ckhkYubb-<0JSU<|FL0CZoUiRoMV3+ z!3JcH^ILA<4hXC0q+nSy?EK0?TXT2g;BMG!T0ItJUO?^firquwJb3>o9_@jTATp(e zg0cO0CS*;lNu?XM-~Dau)3&kQquomT9Fw;#_~yQ9iS`(^x8V=y!@Ff%bx2q`T}%FIi3EGWpyOinDx%+Cu+EiNh6%StRu fWN?ft|FNUGMBulcv3_*U>n+t)o3{c0!I2ow#kL-j literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/95/59ebc4eb06fbd8ad2c82291e7c4de1ebc34312 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/95/59ebc4eb06fbd8ad2c82291e7c4de1ebc34312 new file mode 100644 index 0000000000000000000000000000000000000000..944576725f7ba3bbf4112e02f7f2d3a88bdeb6e6 GIT binary patch literal 595 zcmV-Z0<8Ub0gY2zZ`v>v-YfnUM?BGrnznn{#!FLRTC@tJhOVlnJvh!uu$tJJ?KGgO z|9!_H-RSN-Abc*Lzl%vrlfv2A`I}dhV+O}CGxg4@V&mcb^z8KseZ2+0K`>NQT9hCf zzcH51{V&I9Eo@#XiP~WXjn2?^OHnN(?e?89d_wD#(QwXBVH8k@eQS6$4G=riKqYpd zjfch|VJHW=DiLrivG$-eNK@6N5?Ug(%5S=RdX&Hf?s^Q9dO_oY7U~_C{BRJ2?@2@W zY`m}CyUC<&TP`}v+}L7L?ghEYRXkfPlf?T~iOzw=uZ^-KIo*M%iIx;8ku62r z`BPY=o;QJZYn4~J7=tspZ-vFcHB-)8l{Wr`YrPsE?S}*8o6sBqp^eCzxZoMxiU5)Ix z*z5g?F1z^c<x@9T)(Qj1Brp7b27JU{pr`LZwHi%v$eCqw`M literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/95/d4e2f868179a88d6a7aafcd775b1b73e15a60f b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/95/d4e2f868179a88d6a7aafcd775b1b73e15a60f new file mode 100644 index 0000000000000000000000000000000000000000..45f0a36dcb735d833513f141356df3aaa2f25d7a GIT binary patch literal 79 zcmV-V0I>gf0V^p=O;s>6XD~4U0)?!^vP1^skJIyK+~~Y_LT72N{wALq>+^raA<{*u l#rdU0$*IK*8?R|KEzCOO8oo{~UikPH1qIy)!2mR19k-5CBt!rJ literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/97/bc012fe27c3410a0b4ce57a3280f0be81c93a3 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/97/bc012fe27c3410a0b4ce57a3280f0be81c93a3 new file mode 100644 index 0000000000000000000000000000000000000000..57c6352d043a274ac8778cadd020eb2bfb38ba97 GIT binary patch literal 85 zcmV-b0IL6Z0V^p=O;s?nU@$Z=Ff%bxh$=13an8?6%S?C4EKbfZOD(E&EGWpyOinDx r%+Cu+EiNh6%StRuWLO`xbuZV&{t2gEDziz*1}^M8u>J`E0zVz^d_^Kr literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/98/2a6cc3e7fbb1ae718011a8be2d1ff668fc4c79 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/98/2a6cc3e7fbb1ae718011a8be2d1ff668fc4c79 new file mode 100644 index 0000000000000000000000000000000000000000..20870589c9ab6ac86c6f597362ef5d7896832b47 GIT binary patch literal 75 zcmV-R0JQ&j0V^p=O;s>6VlXiP0)^bf%shr0&mBd--&CEcU-jqyZO-|tuWpe#0g*0A hEiPfu@SfH!@$Yz>&7)5aBK}RgrW82t1^~s89c<L!Oh2*_MW!?Dso4p)Ji$!>9ndPYz(h_c#{Em C7ZG&; literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/9a/74a89e21c624c32c2393171a4ed38362f43dc9 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/9a/74a89e21c624c32c2393171a4ed38362f43dc9 new file mode 100644 index 0000000000000000000000000000000000000000..bc12624c351c9d24e1bcf264c79074aa60f256d7 GIT binary patch literal 46 zcmb9WH2!R0)>>++8WiT`_Ff%bxa7)ch&vVYnOwB8CEGWpyOinDx%+J%yN-Rrc duuZd2@mmnGw{UH2VT@ke#6VlXiP0)^bf%shrkFD3^sR4sN5@7$oVp>nGa^Ie~Ih;&J6 gaS6k@R~A*u>=UA1yy~ot7i?L&R>HOl0Bv*{q#{xt*8l(j literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/9c/4bd7daeee9acb66233c35ccc00016f528b0345 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/9c/4bd7daeee9acb66233c35ccc00016f528b0345 new file mode 100644 index 0000000000000000000000000000000000000000..716750e8e6fc22eea98a5a41d52947ef3de26e0f GIT binary patch literal 958 zcmV;v13~}4?}O3PbTS_Ia@Ts#D1xB2#IF7+Cp&*x|O%k|Zw+^~jb zTo_A5$!5W;_h{%n6FF5B%)H;thim*SpTphL$pk_03*#eP$&y;1S9jNOPvk5Nq%$&k zFjY9r{1rLuXT@|v8d2aQrEmY{z`B(09zpN zj;)S6u|}d;@s-qQ;i03y9b$r0Q+Ji3nh6V> zexI+Uls4t*5K+!11J!8DbQa?7G4x2$c@ApL|N8Xq>Q%OQ|L4u(pAR2XekMe-8uW9| zZm8Yh0+C;{4AoNJwF-sUXr*O?G*i-WEA3O|2`XD5(7FQLZXGV{8=9v?%L-A+@dB<5RJ>z?i4GOYzX!%m-~d6Qo<>3 zl+;kAu=A*(+$k(q{sHjhU_g-*hK88X41u6HL-J+IYiJzV>XNahV>=XQ`3r&vC(b0Lt~Y(F853JxZbphZXzo>zq@OAw;^~Rlh5E-4aCBG<%YC%k zQU763?AJTx+uge_yZ@hAKbVGKc2)C-!vhPNWk|yhr861{hgx7T6D%_z&!kVhMuS|# zw_dt?nI&6aK&Yq}qUTW6Eez7GkHhAK9v-KEG=KjrWg+r7f1F%NlJ&%mEOW;d0+MUF zLr?668w9`G)>uT5gN)$SYHRj;7+$WI6MDkE!TZ?t6H-dC;_FuX*ERr$HiCN#t6O;7 z{L(QEU+v!LWV4*;r3jd8yV=P;!bbma89oasD`sWt!Q1bgg gM~Hgfk3jnAg*<>Nc4S|tF!84S`&vxD0lbI6VlXiP0)@naf?@{2Ti(n|gNokX!17ddOy?yg$NGqMfBe(1C8Cbj$cpNx%>Liy-1~doI#c3f(H;4xR z?3`=t$1v==E|9(CK$|kGjt$xHE?z8G$?}3_53qYxp|xP}M@xoVP7fd(mX*nr#a6QG z{V5G{&S@{ZGvr8>Q?R;loiymR=473rv~{ms8@d7R{j`96lM2RB0&y~in<$BssV8}e zx1ZPdTX={zn`pI-mkF#luvo8d<88cNar6nI)gyd~SGQ9@_Kc^4`^NYVc#P!z#Jo2z zL2vr+i9x}6AKL~qDk$UDRN2ZBq14Z46n6v-nwqSit7U))_N`ktI)==o-(kFVcx>X8ar*Cf>di4B>iD@G}$xH{|Vtu)tOcWm94>n;D)*W zmn5rnn+FPAQPDndtw~8?uvC7=+hfGSuaC<9A{N)L>O|9~yd98Ll1(4LCpzG#5Tl{S zdgn5D)|B(lKx&fkj;Qk6caWyEXIwfOy>TNjt(v^$4f+eGN90_LUW9lNzW@*ES=VEC B7S#X% literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/9c/f7027887cb2651965e9fbcd611371ee355f0b2 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/9c/f7027887cb2651965e9fbcd611371ee355f0b2 new file mode 100644 index 0000000000000000000000000000000000000000..e0e2e882789dc38273d998bfbf6743978f586aa2 GIT binary patch literal 46 zcmV+}0MY+=0V^p=O;s>9WH2!R0)>>++9WH2!R0)?!^vP1^|*@CQ6a!f{bqNjW=sQ8u7U%jUu0Mi2u EK9F(}p#T5? literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/9d/901fbb29aca332080be170cf704cd63d8cbf8d b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/9d/901fbb29aca332080be170cf704cd63d8cbf8d new file mode 100644 index 0000000000000000000000000000000000000000..d3204a33c84e7195e1633e60d89eddd0d97f726f GIT binary patch literal 46 zcmb6VlXiP0)>>++|Ep9-u3wB;)`9 literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/9e/abe4ec02f5b35e1f3418c9ae7a3c8dc2f98c21 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/9e/abe4ec02f5b35e1f3418c9ae7a3c8dc2f98c21 new file mode 100644 index 0000000000000000000000000000000000000000..16ccf75186f1e9cb46a7c546da544c873dea172f GIT binary patch literal 978 zcmV;@11yTwhuTp%V(RdKn! zTYUQXQ}$}{rkImPt0z`k1lrQv9u2=+?5u5WF+Lm)`Qc@*^cKHZE^qMf5BIBb$7-5! zX)Ki`TLi1#qNdMG=Cq-p=ItIoJm7EhCB&Z3W(b_$8t>s=mDKvYx>$d2iJXRkbVe#i zQw3q>L*#H?6!RIWRmH?_0eIoB2p-7hptRMhZQfS}pvz68fs~D=H9IK1&r6}&DmS!l z1S2?Vf)Ul0Z)j=3F4$yVH4Ca4Yc<=`OsWH06Pzf6X;+Bit3Oi9yc7RPa8v+Y;BQa2 zkW%qPHNoejOI$*hS48(}pk6UkYTh`qi?^&+DAs$UG+KG!=m&?F;8fK`YN%$?0;8X2 zYps+`S(>8B>15C|+A^I5zZV3Z8G4aJujb!>dVl{mTmACgAJsi4{yD{Evi8N>@0{h#3?*6uZJlOiSLpc4`f#$+=mTO{#DelC9a4aRz#>5 z?2AbPM!6)pc}mjP=#o8G@`}QZCiI{;JBkJ)+BNjJN@040yMB^fWR@KLe1N9w=WrYt zy`amT_v_S1+L)cPFbzTIT0QK$RajK3^L4l1K%v#5h`$k>=Wd;M1& literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/9f/0dc8976fcd237a63a447b9c060f6c268ab09c7 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/9f/0dc8976fcd237a63a447b9c060f6c268ab09c7 new file mode 100644 index 00000000..2ee780fe --- /dev/null +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/9f/0dc8976fcd237a63a447b9c060f6c268ab09c7 @@ -0,0 +1,3 @@ +x…T]OÛ0Ýkò+®òTPq¡<¾JÑ¢¡V"eM{pÒ›Ôµ3Û!­&þû®ÝŒ•I°çÜ›Rp6>Çp SÝ쌨×Ƨgç'ôóÜASP(.·n­ û7˨ÍwÞŠ•Å´j…&4¥ /©·Ï á+´‚1;…GMúTr4ñ;݆ï@i­EÂ*!p[bã@((õ¦‘‚«¡nîéQ<xì1tá8•sjhv «ÃBà®' þY;ר‹Ñ¨ë:Æe¦M=’{Avt›Mgó|vB´û¶{%ÑZ0ø³†$;à Ñ*yAd%ï‚?µAÊ9íiwF8¡ê!X]¹Žô\WÂ:#ŠÖ½q­W¤ý°€|ã +’4‡,Oà*ͳ|èA²å—ÅýÒ»»t¾Ìf9,î`º˜_gËl1§Ó ¤óGøšÍ¯‡€äM·ñ +hŒÂû‰«`^ŽÞô׉AEy¶ –¢%ISuËk„Z?£Q¤4aý\-\yJRl„ã.„þnÃÁ”FqL>?y òÍNâ˜XhãˆOÍlc·2|ƒ6O¬ÐÚ1Z;]jU‰º5ÈfÊRlÚÇÂm“ÿ­´,w¤û™y¢Wûć¥ÔíŠ)t•[†Dä‰3‹†œèÍB,¡¡´r¸%YŠv=pgÿ(‰/ßâËw4ÿI^7mAË¥ä4ãÃÌbøÇQ_h=‡žµXÑ(Ô §½Tõ÷ÀMm¨4Švðžmƒwî`ÁuGkŒ¦]qí ÙϘí'ÊúƒwÉ0GQ"uMÿ85“øŒ’*7¯ÎÓWQúõÛ],nn’Ý´jÈNâè%Ž_âßò°«þ \ No newline at end of file diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/9f/77ed0204270fbc27809d1520f2f7563123320c b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/9f/77ed0204270fbc27809d1520f2f7563123320c new file mode 100644 index 0000000000000000000000000000000000000000..d2ead442f976860939e97bd52afd23dc39130237 GIT binary patch literal 46 zcmbv?pJtydntW-O2E$J&K3f2g C!V&}k literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a4/17e8a6626fdddc294945cfa60c3dd10810c7f1 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a4/17e8a6626fdddc294945cfa60c3dd10810c7f1 new file mode 100644 index 0000000000000000000000000000000000000000..5498090c88642aea5ce3cdd429f29cf6111d25b4 GIT binary patch literal 968 zcmV;(12_D50o7JrZ`(E$-K+g8IAagn14Snth9Y28Z0oibNYVnULSMO1=M_y;FVPNL{?%v#z@3T4No=zqRf?pXQ;YJnA`ntMYr#+FgFi_6G zT)zp^V$N7A7*H& zluel#qsG}_(22HO;}G|Vnmsp{8R#?n>HX`Qmw55}k9Uh#Z{DTEOsM7(6!XaMnB9;Z z(XTN^QmKcwK_NC;X;mT38)bx5dWSG}VgL>UA_q>ZhC>Uv@c=tkvSlkIv|F{h;Ja8 zx|WNoQ5rNCR_?@!H!|S+xnBq1sXfiF^F*#{*zWUEw0Sv8{ z!L|6LWsE50q)_4@7@d*BUVdISEH@yfMAKeRL0aLgm)TLDlBJgpXvvR{Fi>O*v)d0B z7&d-!#(f*i($VYY_2i#G93l_vCrQe~^e`;VgJ=-2D%B2sYd69m_}#b0B8D7f1TSPO z`FCM#y6ctD6Y>V{Q|TwPQ1wczTkT)=033!NZ!<{BWTbQ*yWAVSEl9G;K z_}fqScy0TQozF)_|1g`HHD;r%p#(O4fBo~=J%5Y+arbHh;#SK%er>qO-G@OY6p>2}HNa`T3Cg zsApqZF=?Qgp9U1X>YSNVklyyEX94Phoza(%#z6Od>fV+h*0=F@C%mf2%b1a`-X)VtN*CYr~d$uq`K8p>+rPz literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a4/8e0be77a34f8625337aa00af0a3597138e1c22 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a4/8e0be77a34f8625337aa00af0a3597138e1c22 new file mode 100644 index 0000000000000000000000000000000000000000..065ee8a5fe6460c6792968fd190e41c09e39adfc GIT binary patch literal 75 zcmV-R0JQ&j0V^p=O;s>6VlXiP0)^bf%shs_p|^Y|9h|g~@mIx{Uy9a=leb)Ohe(&C h7MC!z&Hs2>{SedCTN@0BiqUF{wO?gDA>e+%at`+79$x{mRlGSj9W$sr&+dOMw5&a%trL_3(hR}!rSgMYTd zP{{cPctf-bo)cNgyFNd)LE3ZL)9#FLLe%v4&~q(?bw=c^+sj&r1}OI31C%$e zAQ@*c%@Q~tXVdK1gWOJUuCCwT!0mWGAJ1;4ml<5oVRAjYnBGjUXY}<3#fpLDJ_0JE@cG2DPhN&T>Gu_biuV1tZLkoPC@3^lx4cHE^$Lxmh@e5U6xP?( z62a0_l42~GSG~ipa{DT`|5a|()^}dF)TZ_{j!E>|IQWCF z_?lTXD~XQzIl!*yC!^LN@jjfRp~DoqN{TgGY<$zMS)rA0Ugj|rbw1;Y=2owIb~T)t z=;e}H;sJ-o3bT!&wy6wXVyDd=%aJR~Dqc8kHoG9>*6GfVm(wlX&zfuP7!74jd@515 z2HBnVpJr2|ESt~H8oDPjA`K|!*x|0JRv2FhdLu#xUe z9m-rkefGSCHCCgWmMOiKo}gZFAs>73s|VN*+gr>~!21-0vJGO`E3wx>bhbb1(uzx& z)3AMq^iC|{CrGv{p4WlAMj^3D?*neNk!3=p`bhtqo1OS0w=lW`ud{ipoLJ&z|Fonb mmnOf^^G0FmU!%e8z6`dJgk0V;eiLH8r%Sr}6#oSbqvh|LH4hR1 literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a4/c7916e61bbaba1d06e9615aa80e656bb01a764 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a4/c7916e61bbaba1d06e9615aa80e656bb01a764 new file mode 100644 index 0000000000000000000000000000000000000000..fbee2613896dcfcd69bc4d538b1e3c74d43983c9 GIT binary patch literal 75 zcmV-R0JQ&j0V^p=O;s>6VlXiP0)^bf%shr;KV^Ri%Kxjr@UElu-?HyJZhpNi3z05K hEiPd&bv94An)BXeYtDy*iL2k{y>d8p695K|Ae_#FA{PJv literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a4/e268da08e5d1a5b450489ef85c1af6026b7a57 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a4/e268da08e5d1a5b450489ef85c1af6026b7a57 new file mode 100644 index 0000000000000000000000000000000000000000..d0c7b791247cdc47fa607eb87046de15816a6ecf GIT binary patch literal 74 zcmV-Q0JZ;k0V^p=O;s>6VlXiP0)^bf%shtND&B`vte>n={OiHKQBC~j_wzl=A<`wO g#U%`3_1dOUZoMCG8dt2a4)^+VE|(_{0DHb0Gx>-j%K!iX literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a4/ea7a9b018dc5d0c3fe233264c2c788fbaf483d b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a4/ea7a9b018dc5d0c3fe233264c2c788fbaf483d new file mode 100644 index 0000000000000000000000000000000000000000..60c91e92da5a72767da15e0196df8f821bdec3d6 GIT binary patch literal 81 zcmV-X0IvUd0V^p=O;s>6WiT`_Ff%bxD9F#%tH{k^XgOo=?l!H0=>gOFRhr84;$wcU n*kNJ-1PaAP$qW}lEwA6t_dJ|(wAk_RrQaFl>2{L6WiT`_Ff%bxD9F#%tH{k^n78`L8>X+D|F>v1`59N9lb4-7XxR*&Qb{ literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a6/478a790da7368fd603b7021406314cbf30e3ad b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a6/478a790da7368fd603b7021406314cbf30e3ad new file mode 100644 index 0000000000000000000000000000000000000000..6e852eff1662c578d4953bfe6dddeb5dc6ffa70e GIT binary patch literal 46 zcmV+}0MY+=0V^p=O;s>9WH2!R0)>>++3}p71poj5 literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a7/5ba41fed2e989551ec02a953a45cf7a18af7c8 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a7/5ba41fed2e989551ec02a953a45cf7a18af7c8 new file mode 100644 index 0000000000000000000000000000000000000000..633081e499e15e7a7854fc33ac0af931c9967b4c GIT binary patch literal 81 zcmV-X0IvUd0V^p=O;s>6WiT`_Ff%bxD9F#%tH{k^$hke;zIJWg&xZC5>l)K!qmI9* ny=Y6VlXiP0)^bf%sd93-+^ab0(aYHymf9?~Clr9YNdw7h$km0Q)Zwml@ CPZ4(j literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a9/72fc48d296c3646c2b85ade1b826b6a5156cd2 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a9/72fc48d296c3646c2b85ade1b826b6a5156cd2 new file mode 100644 index 0000000000000000000000000000000000000000..14ebac359d0cc367228451ab0fe9f4f2f8241c16 GIT binary patch literal 80 zcmV-W0I&ae0V^p=O;s>6VK6i>Ff%bxaLFuA&M!+Xs`Se*2~SOOEGWpyOinDx%+Cu+ mEiNh6%StRuWT=e2_lzYbCp&FsS7Iki!*2eTXIlV=MH`ra;2xj= literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a9/8ae2cddee35fd2107281c1d9afef4582f2f2fd b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/a9/8ae2cddee35fd2107281c1d9afef4582f2f2fd new file mode 100644 index 0000000000000000000000000000000000000000..53a1f57734b51159b3a15aba0ed39f5cae5da5c2 GIT binary patch literal 79 zcmV-V0I>gf0V^p=O;s>6XD~4U0)?!^vP6arpZq=w)qZeLU@!V@aL(hO%j#`?5b2`S l;{4L0rzF$=p-eMlj$s)o|5bqb|-T*1~mRIg(l1K7I;Cj5+0M-oL6;y zGL3X*m6Kg*VTH^FVART1T%*&P3S+g1OM6hY)(w#N{Q#;Pm(UF&2%|1s1yL9c9LasS z{5ro|!hNt<1hZv0jbOfj$$WMlF2nhZRyPpL9^hLzyB+{i&8R#0QfTLZ+9+H-F|CUi zp)2}Z$6!V0Zfy!o#7ZP&O=cy}5Hj_QT9P9uP;Z2BeKjO7b&_(i5tiF}>wOyby5xHv z)%nR0rMOWe&m$E|Thf!U$5IN*mT2tgcw3iJqGpRy-jkC#u|E-UTa z^@+Cg+A!aQKfg~ep)olG*E07!P?{63L!(r4!9LY4Q)oi@hzZ>tM+jsYwO#5Gd)-}# ryF!&#G^BQ0V0Tb6x<`e*M@VDcV?qzav8(lU9_%*|W2!50l}gd8XfGUc)w8?wu*c(vXn>xWExO1se&S_=k0waReIX%Dht zTA56lY$dxvpVA=TIr6kSqny&^0xT7-lLkH4Tv=yS+PXWcP2B+ZejLEMNe#0ofjF7L z%P5JHg$H>XU%%eoT*KRFw~IE{@j8L+4p!UEWqciPH+*^p(dHezi8q%EK-P?>gP$AY zJK!-YuP5e%cnNyZzfBAZzV~O_V5SO{acjD4Wr*s2jVD2eZs#Z?A z;nR0F98GB%hOF~P50qm~=V8b!$T;Rx-j09=T{EVrsAT7r;)=@i`-Q!dnIqHRMYWA# zl)}gwJ2D?diju*LF;qy+o*Nj8sCCr&sotsfLpqTYE2hXTUnz~dR%PirQR^2qNQIYtP){t%k#2hIocfq5UP7jJP`LgIMc> zGNfz9VTqTg!|T78_QIt+AS68+_Q5i|_$k}4X;XeHkX4c`=v(1uAe&3fOy77-MqWq# z4JJij(ej4+m+0^%3orU$Vka<=En^9_^bV2jks0t)# z7!+=H@pG8LAG}ADy>%gv;Kr!=2`d`}cakHW^SUfZq|zMa9SP;8VK6i>Ff%bx2q{WTPIW9O$jMAjEXmBz3rQ_5Db~wMEK6iK dEVAas-Z!O36tf*7tC)@Ij}`M(0sxpi7cWT18M*)f literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ab/69c38dfca3dbd22ce8ef76056f723a9f039ea8 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ab/69c38dfca3dbd22ce8ef76056f723a9f039ea8 new file mode 100644 index 0000000000000000000000000000000000000000..2582ad6211ce9c400e3acac5b7934c00e21481aa GIT binary patch literal 46 zcmb2LO C>Jyp( literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ac/dce9405147ec335281985c08936a2ff907c793 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ac/dce9405147ec335281985c08936a2ff907c793 new file mode 100644 index 0000000000000000000000000000000000000000..5b2f0e70240b35c5da9f02efad6086c67cf68c6e GIT binary patch literal 1063 zcmV+?1lap{0hLu@a~d}g?N{zs?C=RvA`+(`+PLi)V=`vqLI!X>`P31|a;QF}i=^|J z$>hKHNq08jILVY5WA3#3^t5mHX_=cPot(V>^{4)egkI3l6g#W3ji-}Wuiw1H*Kg!E zOa?ENmO07NZ;Zur^UDdOh0H6JvUa?pQm@#?q(LE5S^iWiiz6?0 zBn!|=Fp0v%zFB9?fYwqv3RNF;oA5SiN#Hbn6 z;rqgd6F^24>dC8Eyg7%WKPpCRtcPb;aH`fS#nE(D%8V&9cWgCILDtOISH|9or7>Q3;E2>{&-Y%;W5hY$e+B=4lf?}$NBT}#qqnS&seT)) z;-yHTgZ3gYnBi~1P)7RW8a#^-k{w$pBCbp-^LhOJ0R=rO)YIJ1_u>*?bBI;CAIE}K z0hxKEz4E*7#>eVPjY*DuATE^kiruiT_m5K_go(}YOQR3Og~oerT>wuHnr7fo1}|j% zH~Lh{e1EF%2TzQjlz9&9v!;bQ^Vk#hp3nxM-Q=u(`OqjGRQ^C~`h$+e7nsP4>0keR zn9deRJ}yF1luK9!MQFO@JU7GG0fX8~!u*6@aP&DzT4zs`OL=a zqgL>}*xFY{u3V>!F}9|1G>S$VO!#xs`m)bFtLH6g;TmXRgs-)V1Bg8MkXlD?-pIS! zAGox9E5o=`+XVyRHq{LXQ-nyt7hrmh3u)285wWl)h2^lL&Ztgz2+P?AF3xk zJ*sh=mOe#tJul4&blQ*mRnn2hRJ41K9B@%T#MkrHY2U!u>HB?l h;8>f@5OJOEGiXtjgAGH8WiT`_Ff%bx@JP+c$#>4lOwB8CEGWpyOinDx%+J%yN-Rrc dxTzPUal+y1YxV<5!F3*r;vtgkA^?}c6)Z6~APWEh literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ad/d1fc2ced5f64c92c7cb21b482d87353ec30879 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ad/d1fc2ced5f64c92c7cb21b482d87353ec30879 new file mode 100644 index 0000000000000000000000000000000000000000..d5e0c1510081039beebedc3db74defe6274d8302 GIT binary patch literal 46 zcmb6WiT`_Ff%bxD9F#%tH{k^FwBn?4?W=-v9T^q`Ob^QzrU3y nRhbw7fkJUnGQ+H|o<$Fom#%f2Q#0Y1sjYGUu0{6%#M2$9QJf_O literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/af/52b5bd0ad18f90cae92306181d51a189c0afe4 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/af/52b5bd0ad18f90cae92306181d51a189c0afe4 new file mode 100644 index 0000000000000000000000000000000000000000..a569ae2ac0fb5edbb4c1af146b1c9dc6e084f509 GIT binary patch literal 666 zcmV;L0%iSp0hLqHZqqOn<+b^Wt3Gv8=WYcaU_xrv77?wqQ`1q67vv;2saa|V+i6yz z{X5r52JMD~$U_ug`<$F}u5Xm92rhJP*fC> z=fF$5QJU86mth2R$eD;y8cd*+3F;c;7d$3xyVHj+sEtq(hU^@Aj1|VVL?cU)wak5moY*m?56%t%i@&4UCW^&%jq~LK(Pmv9v%d4 zThZX2jkSe&KNwV1#ds~5DV+`S#*i7zg7I`7PR~eo3%iv$8Uq@CltPo`Xb-#~Suu}D zY|g7XpG+g|S>CaceG=#+x#*6tRSOtqYtv-T3zk};wKIsEeX4D;gD714xZ4@p~ zOzQALbfN$57^JlC)~3K%q#`D3GAnt8kf|MNNsgdEy%omw)sVo%Ny^1mSZ?dmpWATI zrGe*B&i9Te!L7RVJW`>wB|RDYUP@uv3XQ#dS=ObLsM)fVYjSc7G=(NXspea(l)h(? zQkGfbVX=}HA1n*&6IWD!LI1yCw#H~GcS0+vgJc+5{**N|DkVwL$ipWSTmQb8gIuH)@JcarMZ- zfn)dp#}P2Pev`%LZ#RqOionN0y`qe0KA@(CuVtB&gH&V_VPbcc_I@)z?$Ws482IUV zozb(Tybd*R$1T!GS#URoJak45KwHfpc1k2P^mW5$iYKObLR_6k&wKQK0p)bJf4W-v4`Ff%bxNGvGG$xKcx$;{8wtIW+|kZC^HxuZkMi?MjS Rt+@}+b@x=YSpcRq5n{8H8V>*f literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b0/315c87b1cc581a12a54b07b96dc8925fcd5fc0 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b0/315c87b1cc581a12a54b07b96dc8925fcd5fc0 new file mode 100644 index 0000000000000000000000000000000000000000..622364dfc574a6b531536ebd300b0ed51d642621 GIT binary patch literal 46 zcmV+}0MY+=0V^p=O;s>9WH2!R0)>>++9WH2!R0)>>++6deEn literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b1/88afc70c6bef38582788459a99a7986182d1dc b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b1/88afc70c6bef38582788459a99a7986182d1dc new file mode 100644 index 0000000000000000000000000000000000000000..5dca557ac1eaefc14301ee4de0bcadfb1aed38da GIT binary patch literal 46 zcmV+}0MY+=0V^p=O;s>9WH2!R0)>>++fvM>Xm#61noIEM;ecA0t&hCug0rXi8 E&zk8J;{X5v literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b3/e2f86fa9f2c505b578d55ec9ebd144976c0821 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b3/e2f86fa9f2c505b578d55ec9ebd144976c0821 new file mode 100644 index 0000000000000000000000000000000000000000..c9571710e3d185fb2e5e2ae5d131af513e327636 GIT binary patch literal 72 zcmV-O0Jr~m0V^p=O;s>8WiT`_Ff%bx@XId=PfcvOhg{#^@qr=-0F2ClLi30$cs}~5ihaAfQ literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b4/4c7852d1b04ff2fd1b63091ef51631ac272811 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b4/4c7852d1b04ff2fd1b63091ef51631ac272811 new file mode 100644 index 0000000000000000000000000000000000000000..b57d82fed866be7e5221a767db295df464fc91d0 GIT binary patch literal 82 zcmV-Y0ImOc0V^p=O;s>6WiT`_Ff%bxD9F#%tH{k^IM^~N{T)w3UwiqgbrDm-W2OFd oOPUw}fkJUnGDC!;)wC*34)Om00L=OxFnOpY&;S4c literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b4/7eb57c3f30fbbf44814063013ae2223d008409 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b4/7eb57c3f30fbbf44814063013ae2223d008409 new file mode 100644 index 0000000000000000000000000000000000000000..e5e7003bcdb3ecdc7b7d3b9f38b832113b32eda6 GIT binary patch literal 706 zcmV;z0zLhB0fkgiPunmM-fQzKPJIGYTo{w4jhBYfY1OK9YRV9gPI5^-QaiIR4He?Q z@0D)4ZJQKUGUeRvWB|X=I%PC`6lZYcQTyFd|M=2FY)uVo zxdm+qYKM%W9OSA*z=sqo0;M4}>#9^zrwEOrReMi|;+eo*hhY+u94lJVrmG={~ z*1QunuCX!pUL+{B z6S+*u*sYM7+o~lc!kSFu3wLnAn{;DH5YrH;(S#2q;`V|o-hadH-{iD3b>Va5 zqw^M}dvyq%W12#?ugFkTmnDafx(XcaJlVmpP>wqeMu$cPqeH4eRVVzdKpPD)ao5Pw zXdJgTg}V>QcaL}3!DA5gMlU4`dR&B!B;--$&3(^KD4%U*1P{i^yQ?=wWjq;L=VnG` o?&z2s-I~V1q#ZSWOg#p@-hpnOS;~nHlt)(YDF~i|zu$P++Y}63t^fc4 literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b4/cc9ec916cd76a6a5826fe71b08e826042ed594 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b4/cc9ec916cd76a6a5826fe71b08e826042ed594 new file mode 100644 index 0000000000000000000000000000000000000000..a7899c9c02fa50655791831a9b39b077cdb0b839 GIT binary patch literal 973 zcmV;;12X)00o7JpZ`(E$-mCp9I6tiq5}mXKihxnEt-BOR)}U^Oz0wkGGoeU>{7f5R;{NdpCPuOi82FJu58&YiX_?4ZogktZl9^-tBhz?scy88eh)m7x=H+n?<={HO;s* zmdcXNf>-BJ(=C%ZZ77&|zq?Pj_)R{C+|$VfLGUZ%BiyKxT7R#Y>$E3w76z^}FnKgp z*vx#29M-d9Iw7^HnD{dQFZ>a~M|)E+T5HudAFBe;<)+a<%1YCk?Ua7VOQG5-H?(d9 zBRE-t6V;ZlXlcPO_+;KR3#QqM@wLntT{9givfRTYxaSFRVpR$tCcnrQfBbm2`2Eut zg3~^j0EZ8B4c98}sV4ZabeETK)0f`B`+#r7OsRR}*e^b?TA?I>mC|V8nLs}~0toJ# zy0i_|Oj@A$dHR-0**A=!u4&u#!`ug$a!zfo1qL~1mx9pDE z4K5J*KFg3$>Y;5=h>ccS)kw2O8E%!{qbzeu0a^nh2TrSoL4BF=03$2;vgHD_pjutB zUt;?dzI(tsw9dGVV<{Q9#1LApbJg0WwWk7|v~$7k>6Ye6As6{Of{%7QoE`>PSFB;O zf~HTPx{bZV_!FSSV&+{`X(6E60{WW;!_{4cE(KxdK$Zk7gWWzRw-fr zqx4D7mKkV(qm~D`zVr*<1J9E*l-?LeUVDB#Wg+r_B6uqfDUZ{`TV)=2gMeb8_UH$@;ReC) zzBLw6k zbFQ%9OOvITnSj3*f?#LwBd3E<`Uzo@E(NP1?zHlz_{f&vV+03;13)zwP$nhW2}HNO z^YbBfQP0M-qQXEi{~b^;R2em=Absvm&jJ*Kol%z;W9Zc>z6YV#KBsA)1o>opP{pqL v-?%KtaKtyI!#n`jiRphJ(SHQ+89WH2!R0)?!^vP1@hy9cf^-=Dm*`TL6hH!k%zX!6c~000_g F5lXA(6L|mt literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b7/a716a20653e1c5ac77228a6395b58d108b41f9 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b7/a716a20653e1c5ac77228a6395b58d108b41f9 new file mode 100644 index 00000000..101d3658 --- /dev/null +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b7/a716a20653e1c5ac77228a6395b58d108b41f9 @@ -0,0 +1,2 @@ +x…RÑjÛ0Ýkô—<µ!µ»Y^ê&3+ÄéJ{íkGÔ–4I®kFÿ}WŽÙÒ±<˜H÷ž£sνY­2X¼_¼ g f°Rº7¢:8¸º|ûî‚> pE—BòxëÊÐyüg‚yä­ÈQZ, •šižv¬Ìá +”„«àÎ<ët,MÏ—ž¢W-4¼©´‰CX(E€Ï9jBB®] .s„N¸ÃðÎÈâ•ÀÃÈ¡2Ç©@÷ ÊÓFàn þwpNÛaØu]ÀÉ2UX Ùð6^m’tsA²GجÑZ0ø½†,g=pM²rž‘ØšwC>•Aª9åewF8!«9XUºŽôZ aYë^¥6ºò~Ú@¹q Ó(…8ÂM”ÆéÜ“ÜÇûOÛ»=ÜG»]”ìãM +Û¬¶É:ÞÇÛ„N!Jàsœ¬ç€”MŸµñhŒÂç‰Å^Š>ô_ƒ’êþl5æ¢9Y“UË+„J=¡‘ä4šFX?WK /©pÜ W¿·ádJ!c”ó£'*°QKÆH…2ŽôTÕ†xKÃì”y 2¥\—Ñ1dϼü/„6UåJ–¢j Ž7ÄõŠ„…³a{¯Ç½^ó'„´GC>Bv}|öÓmF³†¼æaêÈ5¯•Äå(Oéác“±Ùú@rxR¢ ò,¥ÑËêë7লçÔ:™üe20­oüçÁ a~¤X²É c/ì'ÚuJr \ No newline at end of file diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b7/ca9026300d3fdd9af2595367b0afb3dc9165d2 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b7/ca9026300d3fdd9af2595367b0afb3dc9165d2 new file mode 100644 index 0000000000000000000000000000000000000000..b13cce512baafda20efdef138ffb6d3d28fab4f5 GIT binary patch literal 46 zcmb&M/ ¥hÑP+5eˆG'¹M=R;³oâ¿ïÚÍ6:–‡(¾¾çøœs¼¶9œ^|ú0:p Ûl®Öç§g'üú ´F°\ÔFÕ ZZ[ÇëþËK†ä­.Ðx,¡5%ºJU0¶ßÂwt^[çòë ß]Š­ma£¶`,Aë‘9´‡•®ð¹À†@(즩µ2B§iÏéY‚xè9lNŠÛš-ØÕÛFPÔ‹†ð¬‰ÿe4êºNª(YZWê!?ºM'ÓY6=aÙ=ìÎÔè=8üÙjÇ–ó-¨†e*g±µêb>•CÞ#dwN“6Õ¼]Q§­¥öätÞÒ^j½`ïo87e`df¸J²4’ûtùu~·„ûd±HfËtšÁ|“ùì:]¦ó¯n ™=À·tv=äÌx:øÜ¸à€Ç¨CžXÆð2 ¡ÿ™¬x?¬}ƒ…^é‚­™ªUBeŸÐv ºöa®ž–AR­7šÅÒßÛðfJ#!8çÇ@TâÆ^ +Á*¬#ÖSÉ­Ñ$—èéò}ٵƠ“‹Öܳ“} o Z9µÁκG™[K’˜GÖ>“ÌbÇ×ßÑÿ Ž8eø*F#òZ;Òè';¦=eÿ…þ>2ºù؟̲Y=«÷wŠvuYÔÊû#1Þ—)Æûg‹¦ÍùªAì†Ô•™r’.5ž”!õ&»ëf¬zxâ`>ÅA²ºä¿#&skUé¸ëàUˆWñ ^Fgd \ No newline at end of file diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b8/343fab0cd2dba07c7b3cbbb02469e04dcbd3c9 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b8/343fab0cd2dba07c7b3cbbb02469e04dcbd3c9 new file mode 100644 index 0000000000000000000000000000000000000000..8e779f6446e1fdc74d1af64a1514ad9a03fabed5 GIT binary patch literal 81 zcmV-X0IvUd0ZYosPg1ZjWhgEv%FIjGODrhJ$xKcx$;{8w%S+5nwJOcz$}P<)$t*}L nD$&bLtZ>WBNe#}dO0_aHvha37l?zHOEKMygK}Z7tGQc5>B94V=y!@Ff%bx2+edXD9Fi7PAtjH&(q6FEK6kQ>R+i`*XwIj U6)BkM=popgXLa-}0M(chspkC~C;$Ke literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b8/cba47468ff99d781fc85c8ff0686611720d87c b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b8/cba47468ff99d781fc85c8ff0686611720d87c new file mode 100644 index 0000000000000000000000000000000000000000..5e9f94bed99b521b3a5772ed2f98c6ec528b192c GIT binary patch literal 84 zcmV-a0IUCa0V^p=O;s?nWH2-^Ff%bxaLUgwDK05WEO1FpE~+dj$;{7l&dE&8D{(9+ q$jMAj1PSP6C6*;JtUNL^cc!yT(4p9)^2~-Bi|6m(;|c&9$sJcSrz0N# literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b9/4b21df294675f5a6e0da7a5c0a2e23183466d3 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b9/4b21df294675f5a6e0da7a5c0a2e23183466d3 new file mode 100644 index 0000000000000000000000000000000000000000..ff73c5bf289917b2eb7353af628a887ac441b799 GIT binary patch literal 46 zcmV+}0MY+=0V^p=O;s>9WH2!R0)>>++6VlXiP0)^bf%sd9AA7N{k?mFk#&5~iSEMw+#Q24DQM7kuk gxP;-yhSnp6`)l|!KF8TC-0^kxNmZR)0AC6lsJ9a$=l}o! literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b9/ec320a66eca056fd340056619de894e9a4d7b7 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/b9/ec320a66eca056fd340056619de894e9a4d7b7 new file mode 100644 index 0000000000000000000000000000000000000000..fd12ce50163239e13c98284577a419c8b7d1daa2 GIT binary patch literal 46 zcmV+}0MY+=0V^p=O;s>9WH2!R0)?!^vP6cSjn~>Qw$)PUTITYT01hD! E*tGr?9{>OV literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/bb/eb269763559f8a138b18dc7a31e16092177b96 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/bb/eb269763559f8a138b18dc7a31e16092177b96 new file mode 100644 index 0000000000000000000000000000000000000000..b3a8f9eb81b6d1db341c14944964b9646c44b903 GIT binary patch literal 82 zcmV-Y0ImOc0V^p=O;s>6WiT`_Ff%bxaL&(5%S;bWEh~yyDK05WEO0C+$jMAj oEXmBz)5}UMOJoSza4arKHO0|3;F~Ag&hvXi1J~sP0Gz`chPMtNyZ`_I literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/bc/27392f0e73ce9aa93dcf154151cfc78b77cd1d b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/bc/27392f0e73ce9aa93dcf154151cfc78b77cd1d new file mode 100644 index 0000000000000000000000000000000000000000..77a1b10a2b65f8c5b845eb75e63701cc495b26ce GIT binary patch literal 82 zcmV-Y0ImOc0V^p=O;s>6WiT`_Ff%bxD9F#%tH{k^xMjU7Ym;96tT@?~7Y>F^P&mF} ohmwf_5GWKEB{NujQaX3A>Hge<)=Bk`UIjj9KfuWf0Nmmoe?Sx>fdBvi literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/bc/29315f3b2e1ecac8c972352cb9aa4d582f8b06 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/bc/29315f3b2e1ecac8c972352cb9aa4d582f8b06 new file mode 100644 index 0000000000000000000000000000000000000000..84c234fce00eab4164097f710d34690060a590c9 GIT binary patch literal 46 zcmV+}0MY+=0V^p=O;s>9WH2!R0)>>++40V^p=O;s>7Fk&z?FfcPQQ3!H%bn$i7%S~Z87c$LhW~Rcch*kG*U%R|p zZdJLdE>uxLey(0cZVm&-zXN|F;>yZigzeIroA==E`;ZoH69XVnC@xB7SaN(~UgGZ6 W3oqnN6J6EtENnO9@)Q6LDJ`Y)7BWo$ literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/bd/29978a7edcd2f02644fa90165beed8a01cca81 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/bd/29978a7edcd2f02644fa90165beed8a01cca81 new file mode 100644 index 0000000000000000000000000000000000000000..d9f8de018edf5d4e6c9933b0e72686c953e66448 GIT binary patch literal 814 zcmV+}1JV3=0hLwXPunmM-fQz$och#G#f5F!wDCeHOpAt!M7kj!-Q=2jq;_Us2-URz zeP<`o9}Fb=&^Y$}`0o48mw9RCaP;Zphd1N55xj+osn%8%OM-WYNAC~#?=#R6!SJTi zvIJSv(pY})R!*>+_q7sZfaMQ&wbCPT>*`Zp4S!^4E zqz*Lr-;$_uU&iC6X@m@rg|WrBYzuPZi)3;>P0tS)cIWm(m*^Z={9P-{CC}F&D~6TH zIfE@_6Zk1C@);QqyRnLtE=J(Yf*NVjW6hN#tL8QBu+~)rT>G{G^CmU);}nv#52taO zq$3~XI+=aD{4s;;`06U2&XV&KF0Wv6IXz2e$>o&azCt{`f$z!mYy`-hu{wBPSziIm zs63yT2l7(%q(3SK3qJSnuEI<$RK}(0qLu|hVeZgst_Ui$E9JbdjsfN#QmIyoB!#U_ zH*Bdijw0sy)(6UQWsakWQ5Z{%rx3qttw_w!(ecx5TWgJ0T-ExTE7^5)m1RH+D_7VU zdn@KBwG#`Ok+EwbHMdm&CE}V)W;EeFi8LfQ<^3n<_MNlR)Vau* zSxtgv%sgLfarUs9gp(KZKNG@V0OJ&)m^`drA5|kQN_8)=wsmQB}|R)IoX*9O##O;;#eeCsi@F$9TCy&h&^|&4GBq8h(=dW$6_k+sp z<|D92oA1sj9t^y*=b5-xiNTO_^?I8+2mQU6emXSP@cmPoY4YQc))n?g?AGf&G45=5 z3_jO1Jb`x-hB*DlX4}-nWcj8Bw={K`!&2TMPuUjt!&#WjOa6@TsNq4wABG$mVux-p scoxJaO-tQS6u3{48w>-uUe6y64u_8vaC!gjWMA9gDEb@y12dL#(6(owB>(^b literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/bd/6d7601e41d763328a6fb90fd11405dd87ebc53 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/bd/6d7601e41d763328a6fb90fd11405dd87ebc53 new file mode 100644 index 0000000000000000000000000000000000000000..de1761356cee2b913419c2d606eb330368cd3a6b GIT binary patch literal 805 zcmV+=1KRv}0i9G`PunmQ-D~nI?)sFX;sVn)Z3u}{il_!fYG4dadvKDQ)FQPr+i9pK z{`;VIWHSqUJG<|;>F*QR8G@oo zA$bnGv@@k?+=d>(N3EZ?CDzcoma{?4gQ0eAI z;I3KGzmxBB)f%O$sCOVjXz7F$#S#=UXZMq zM_!k=CqovMVjDkXa9mN^Qk8I<1K?R*R^#4^nI00D0fsK)G=Vok0lWumeYf za2)m=$@Td1^y2Cgt_RcUU~)Mgg>W&2;l<>5d^x_D(C7pPlNn$NLP`j$n=rC}+LtHdgfc@a}##3CV+P0*A&7L7ecPIvUR=yU3Is?aOo#tzAd zR(bAD_Ya%0JWAC+d@dgUa7x10aK9)cx^NKZocj25>2A{9Ms47i?|X-<7V$mmfCaY* z=gScFg6=lV|9p`Yucb4tw_;c*kRRbr!y0!bGY4xsaGd!n{a9JIH784n=kxxp^9vZQi58jm7{pc%v4 j1CV9j&U>x-N0RIF8#Yo-L3l51w7SIB;l2MGvrl4w+nkA% literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/bd/9b9c7805089d87771580fba42e0a760dced62d b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/bd/9b9c7805089d87771580fba42e0a760dced62d new file mode 100644 index 0000000000000000000000000000000000000000..e7d11366dee3e5457a618af54d55a3ed8b85a899 GIT binary patch literal 81 zcmV-X0IvUd0V^p=O;s>6WiT`_Ff%bxD9F#%tH{k^PYU;O3a;2;OsH`5i+5tXdoNcJ?GT literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/be/34b6152b679da2e544f3117341d69a8f45b4d7 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/be/34b6152b679da2e544f3117341d69a8f45b4d7 new file mode 100644 index 0000000000000000000000000000000000000000..d1c77073e8a65e60bf0f2e9fb00b74eb64629ce9 GIT binary patch literal 47 zcmb2qY(>DR=+^xxkgP%74tu2~+GawD1WCnl zi~a9AlA=soO6LwO&;oi8$-5)J@4h>7A>;x*`SGW-@5uA}TA(|o4VTTu>@+`_A=Z?# z;?3$}_U`R(*|XX6VoH>jH>|V>tQ&KFZ}`P*ZLK=Tc(d8$nl8WB6x3Z3Pvj}TlK0c09|gB22z%q)@&p7ZC(o5 zR=J_I5{%$z2~Jd7zNDoEzu=R3(=3=~@7q=ooEU*imw@8?52;7qP5(o1Gyq%R?Ut_K zD8&uc1n-9Kzzv-4BfI)#Fsqm;HCK+@;w7skiuqkijpiOG`o-ZRI5l-UD5_awfx(Zn zvyjrJtc=m(Y% zjSEB`Wf>Au-nI&b*l4L`jWkoza4Yo|WtkHKFc=Uya9Sz`>0`zN>{!VcEfyYU9oPVqsB=nnmVffLk+$F_T&H# zNeQIq%lgQ$*P$N3EtbL&wc?Itw~7@?)&%>%a8^@7o(oe&zViRCgz&tAQ3*y50!^l)CkU-ksh;#vxY^jVKFqLc@P5?e>Z>{9UivCcZo z=$GZhG6RB2l60ic=-NRw<_w;e-tm8>5RsgHUzrX>{ylKFW+!E1m~ z^AMyr{pwMGx?o4-<&!axU7ordCW!S-e5OP}9!w9i*k^w{iC>K@$8dB#rN=w~*Nf>J dkm&yc_!Y}_1W)XueZsAz_5&7s3c`)~jN literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/bf/dda449a5c0245fdd90e8901bb238013a67bc3b b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/bf/dda449a5c0245fdd90e8901bb238013a67bc3b new file mode 100644 index 0000000000000000000000000000000000000000..3ad99902a4ac0a88fd2a5a4d5c725b271a6733ac GIT binary patch literal 115 zcmV-(0F3{50V^p=O;s>7Fk~<^FfcPQQ7FjI)vL(OVeot+&8L&7RwpTU>S_PEmPpy< zS0qggfIy)rwK%`DC^@y5VdFKeriEE&T*KF?#S0(bqM)GrAQ+;ixG0%nXJ#PZ#^X%_ Vg^del`|Usf^`XKVSpX~WDSD#gHg^C3 literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c0/484bb5262778ec6bc2be62e742236d565b8427 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c0/484bb5262778ec6bc2be62e742236d565b8427 new file mode 100644 index 0000000000000000000000000000000000000000..63dc26a1d0ec728fd3901afcc756b70021b98456 GIT binary patch literal 124 zcmV-?0E7Q{0V^p=O;s>7G-NO|FfcPQQAo*8&Q2}TP0r6P$S+RStIW+|kP5!`KrVld zeB1JjOU!0_JT9-lvI(lXAU{{H0;pv29IK;#y4OQp&F6TOelSb%V}71tVgLjR#YM>s eMjJMHn_PO|b^MqO`?dBfeZMaktO5W)2`~g2!8TX` literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c1/362812db9d81bf0ea9d5044e8984957a526f9e b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c1/362812db9d81bf0ea9d5044e8984957a526f9e new file mode 100644 index 0000000000000000000000000000000000000000..75a17ecc25bb02a14303007ca417c1931fecedc7 GIT binary patch literal 641 zcmV-{0)G8?0qs>yPuoBc?G^uuQBDa8HiSbzxZnm*t)fJVLlMWdJ#n^mcDK80OoaIF z%xo;0s&MO(9HQ*b%-i?oD@CIVIQe+|=|gfD!68hw*;-kzJxq>ICP(yj3Vw~C=~61u zfN1?%TRQi@Tufmcc`Zv+4l8I?g*F7GMwArWTgLDMt&>{8BtC{AqYir0V06Y1TiwD& zY(Z%ctwX|)4py>3z=slz2dSXc8`DUkN`y}Ob$F*oVJ2|bW9Y&Qau*a}wxC!0jv#zb z8u+vJ-ncJG(sf-d0_9lSI%#%-TymXFFK7AX5z+3$Zd8NLfyLjgv?RIMf-pp@6a|rO zL>KZ?TO^y;OuMtvOI44->6PzV#TbxsM%BRwV_5-}QF1=9 z3dzfnlm1dMSdpF2&R{85vLtD$Zbgky>wC0{6oEmzk&f%?h+xH(8o7~P_;B^78}_P{ zMA0klcFOJcIXw8@Ztv~(U)znw`WN?Yg&TbqMbz}#dTReV{@E(&e7$zj-?DR^`q97BYmGgcQoTpdbV5lz~tVb9;_%xqpBFBe+^Yibc0c3 b+Jbf|goh!m*1F{IKp7sR=qY*z*1A2_vsOiW literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c1/849267ee0c808e8777aaae5894575d1afc8b19 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c1/849267ee0c808e8777aaae5894575d1afc8b19 new file mode 100644 index 0000000000000000000000000000000000000000..79c4865995707dfc1cf1766afff939cbfb033610 GIT binary patch literal 1034 zcmV+l1oiuP0o7JbkJ~m7?bZGjtkFYykhq)lBUo@1q)pQX*liYZQuInow9Pdo3M93* zQRKgO_@$**_SOxGHU)ezshQ!tH*bbq2)RJdzW?^SFUX5sEzliPn#<;LcAlTj5Nk?V z@n&^7`|$pC_I&oDn37h>TUHtb){VZ{X?{6d8`EB3yxnf|?Xz5}6@Gelc8-6)zM7Y7 zR@00(+R&zCGw;=V)bx%uIc+JJIlr5?*Z7=n2p;TB!Dyvq*S@I=K$q)Q0VzvGYqphYlb1qv zRjz5>3Py0W1ShHtU((WmpZCd}Y35Bc)2Rh-z$LK*uTX>Ht3OhwJZyg?I2wR0P`9Bg z$fmfZis1XD&AEXDA3xYxfMvyWsd#HCE?%)(qFCjnRA}ztq8}|vf>Tp_NJ|xK4Dk3k zM++%U%FQ8itW5?=QHH6^$9=%fJvmQvP-yrvO3jT_dz58X4nU$uEx#&;bz=6{LmF`p9tBLq5PQs^J8=*gVa?WkoA%g55ux`-JFH!Y;2{ zsh~=JxkJV9}8M3 zCk|*Ls&!F;PID{Pmu)M!pAV3`l~1s+9=G(4#?~p$^XCK)c3e=WZ{M1|>CcL>X3NX< zNMmVjdUL0n1aPXI$Usls-YX^!ilZZCD3GK2h#k`~vlM)HWUPR&hY37X>|c+#Pt0e% z*GBQ(NV-9FhUrvu|5=)>Q*1*s%@lOhzme={Bpw<8gPG{5O6G*?QQxkQ)0nX89_7{BApK z5JeU;f}6S%>}x-~?JP^^@#lK)W5-WODVrr+%vhX0mIf&;Wp$oyPfIF_7DULy$Ob8w#xJNhwRC57k zl8wE)4k5ZuzMl@Mk9snuB^4Tq`OkoYw*{m67^HXo*OLH+U?s@^G zL_vBD_uHc?_SHXJ#Lq^Shj2W^JObB?>3<;6PXhQE%k==BI8l2w`Wvf%9v0I-0e(^I EEXRWfEdT%j literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c1/e0bfadd1ddef749d91f9eed680bfe477506569 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c1/e0bfadd1ddef749d91f9eed680bfe477506569 new file mode 100644 index 0000000000000000000000000000000000000000..5a4759794899163a7451f3d73c73828b17a5f089 GIT binary patch literal 46 zcmV+}0MY+=0V^p=O;s>9WH2!R0)>>++9WH2!R0)?!^vP6dd9TLmjHU+rX`Pr?JTb38PLm<@x0P-gd EA(D9#NdN!< literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c2/f22c9294633a83454c838e49964c6260b8bd9b b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c2/f22c9294633a83454c838e49964c6260b8bd9b new file mode 100644 index 0000000000000000000000000000000000000000..3a4eb3df27afe971ca18e1bedd1389c81f5c9a28 GIT binary patch literal 73 zcmV-P0Ji^l0V^p=O;s>8V=y!@Ff%bx2+mANO-?LwEGWpyOinDx%+Cu+EiNh6%StRu fWKf&v9qYSdPvbw|*n=FByi;dRY4QO8vvn6$qmUd? literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c3/14ace8bdec75c4216b40597a03327fc6730e79 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c3/14ace8bdec75c4216b40597a03327fc6730e79 new file mode 100644 index 0000000000000000000000000000000000000000..1e69bac296f0c2ef49757155ddcf8fbf78ff67d1 GIT binary patch literal 732 zcmV<20weu+0hLryZ`v>r-YfYPC!V09rtK)K6QM(Wnw;bUUW1+44k?=Y z-**maOV(=A@<6bC_ucn>cTSwE7*5a6KD-+qd2j?{RqV7_tu36LoW4J%pO0YI2#Pj^ z!tu9c>B^Up9!bD7s7L1{3BQl_ZuB){MZS5LCE<*nK+mCeo1(D2^JQFghXwMTyU8nRKl+7It_|r0(T9DiY=#bP6@>hRCX8$ z+%}}aJ!@+V^JzG&s*3TNGE;gr%=d!K@H!Yz!)SU;w41bBnWHhF@mDD{Nsf2G3!;_q zn8@b5s{L7Mq%*4=?Me$P-7aA1&*y%)2&NIt<}jXxlVB0dLRx(WKfHslK{y!zl4sN%d?>V2Ky4Jx zPfTm`B6OxdcMLK*cWYB%A~KPXG`TAI3Sp(Ts3j?a0`*21*H=RXQ%5Nm8)3Pvw_c{< zpi4u~BcJabP>LIM;d#VDX$!IDTVxB(6Vw+^o74>Uvy{TJ1seOtwl1Ya&E}A-|qQMd+Ek0Nl)dj9- z{}sFcO=e4sr*bQ_k{gt5rGI1991iGDgth|Bc+cve8d~&gW6v8EW>7;zJtzMD;<;&a4KVQA^E#vFZuXup=_O=5H`w<&`}qRv#_Wbm8bhbKGjjP} zrzx>jBBhT<-Q;Ve{%q_@Cb@x0gaPQZ__{!hPh^c#VDt=O6|100J+pngRrO)6sJ@Laah}9XBB(b>_?q| z`rny#tP+Y4_+ahs%)EZ)opoBN6wW8-uV00y3{GLDn!Og~#=^zq{PK)mZ@_L46del5 zE8xyZG69wO%3G14G?;^vIqI$`YIsJqePj%uP#d8nTm%ysdDUSb8lFtO#9le5 z`5vUQ;0%(6Fi?mJ0e2ZT7KDUM)lDV1%n({(H{Ex76;A>Wy@pCHr*uvQ%^p;7oCw_Z z(BPkqwT*cjhHcvhyh9F@F2m~3kO^<&*?f`A&j`COyOR|f0~)_Mp{eC`54<6)jHd)! z@wW4))JQR_Ja(&v6|x+IQH5=}M$eiHW3@<~{mr$$8=&5g6Ua9%VHhP4CquZ7k~kTA zk^6Z4etEZs`)IX_7VCJPz;Xq%<>Dq@$IAun-a)i@fDiHFW(-K4(R6UvXx{;iQFuQw z@61ckoBlj8C@Ajtrol`UBBR!1>3E4ysz=n4I)VmuEsUS5A;8=tRiYM_+wSPsZ8(}z z$Qb#&^+Gw;YRVW7Fk&z?FfcbYRS0r*bn$i7%S~bMSi*awZ5R8^r!#fe_=jvM z%MrK!3RP5)pQ~4qo5N7Msq3nMar2*u4=Ki#B42Mx_C2*WF#rOE;-X}R-?~>1MHH}C VrS+GtW%mu9((8A-8UT&RDu9MZHV^;+ literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c5/38fae6414da0f76bc7207a30e55b3d3c1fa147 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c5/38fae6414da0f76bc7207a30e55b3d3c1fa147 new file mode 100644 index 0000000000000000000000000000000000000000..e18370299b208f8c22d9ba7c9abc0c7205c8dfe6 GIT binary patch literal 1445 zcmV;W1zP%e0d16fG?Zx^#~-m9HW5!+N=+IV7l3PfMX2v@+@0y$UeP_&A z+S(0CmXt1Tn_?ZcQgTUzC@NuMQ@bwVR1~d~WZK+z^uC?Uo}PbypXdAhp6~C1ArNF@ zx6#!FINHjO355Y83=YJA!3v8@3QU?|uKtiqYXds-3N^v!kO4g#}|Ui^oSG z@LX{6Tc;x3^6Ga5o44NmIn}L=tVbwuMLaNW`$mr$tfRemAZSfSPcXM+dQ}WZliFcz_S6D$_09wx_a-CWmRMQlU_bptB>bI=kqaCE++sVG<8qu z%^uG2Q_qSCk5o>MNh>%@FhUdzx|yHn=H1B3SVP^MdSm8sz(AQL9%b-(OqfMxaA1gs zk)t36A`xJ~i@lF!bhc)4`*NRPv};(6RXd>a6&~Em$rYMcaF&&Si&Jj8c2fY@hG} zrAj`p6)++@A2&T6{e_S}pE{nDjn<~jXZlZKILCzK%}a)8EV)H655;Ia45nc)p9gf> zpk~>OS6+g9q9Kf(N*S+tpP+CD_a|n*@Z4z$Ab5dVE|p{t6Gm zm>gJ4Mqzos(-7bi9Wdq4Vex%k+v(B;>hHa_(PqH}`Kdw{lA!LC*&_jgD{W$eZ7RIz zv6hB-oKF*CYO-c8}>pqxDu&@R#Is%A^T77#VM0 z(9mBi9vOpB z45grKP*b!s{${fZ|28sU6WQ;vuDaB^8`nb_2rR%*;MARzMUf@Z%E#u$R(~{IEj4Hu zBM1&8_XM<%5(5vDR%xqfvfn?+137P~x)B6`ArOsArpwn-qqk4xdXjiNx~ZN%vc-%W z5`Kh4Acc2$UYZw{Kk&k zj1$chEOVnK1q@W|6bC-K>Nh!O$j~r;Z(#QaX@d?Wmb*uUhlyBGNlNif) literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c5/8b845ae62895b09bdf158e8e8c85f3fbc91844 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c5/8b845ae62895b09bdf158e8e8c85f3fbc91844 new file mode 100644 index 0000000000000000000000000000000000000000..5452ccdddf6db6e70dc3885111bcd3421fc9bb78 GIT binary patch literal 1019 zcmV@_2XOci$bgkZOUR{qW;Y-_V!$l|*;kSfT36*?D$0L%c3j zDeBeb?Bj>u@Qc~Yd`h)Zx4du&tZRF5Z^h+o?VP?KWV_vF+h>_FEAsU0?3{eMzM2sVdzS-jQVsMsB^Go~4sg?l&euF3Q43}R0w69mpLZ18ZU3g$vyZLH%rk+-mr z&dB86mT?n@5E-mz`E)`nRdV@f1fGW@N(OsVFj^Va=(lAK=rXGfkg_za;#*}lSs_(Z zW|mc2a!QgVTw=zFB`X}N;OJrLGp`}dQ^E&3urIkSjL@F${57u>N)=x!gXRG``o$xrq;Kj&X=Zrs zfYZnMS}5iEJRKs++h9#uP#TZGYHjPHnH(DB1A;Yz@!YQ*u7<*{|l@U?kMf19Zme^ghnyq-1pq9Kn z5Zrp~p2B1r){nChBr%`^JoL2CFF)=)L#%y1;9Ane38L|Nx}D~^Ruv`TpU-_lZJ}US zR9YFRQd|X8Q0_h~U;Y8`-o}6;FAM`dp&24UX@+ErMo4HJ)tG|++RmChj2d7*&Y8nD zUSUBT&``|Uyab(QUaYUQmLkpy$lc4QweUA?*&Ry_l%HoWC>iVor$OJbO*_-y4d?Y% z6zh@3`nBoIgKm0&``SqibkyylV$#q!I$nkXIjWD;F*SEfDefN~F(B_@8vD9^bm)zm z_>gD^T?~V;VbEOry8WNiaNL5fdkq%E9d#bhI?eB8)?0=;LSch~eF>?S4NTy60K~-! z%|B-GD2?Gg!_o6Nf6@!t=F*0TS!XvwBdE1hJM_e@g+=hYZLC8KdB_N!yGHWwmw$|*SEneww!hw|uZ1MYsNrsVRK>3Phl}{d p$np@5eas_potVA?iT*2qU$9&c;7Jp;Q)7Iwy6>ud`Zu3qt6U(u5NH4Z literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c5/d84e0a2010b831997e9d2cfd53959497a3a787 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c5/d84e0a2010b831997e9d2cfd53959497a3a787 new file mode 100644 index 0000000000000000000000000000000000000000..4f39b61281f1eb1e5817ebb8e83b40354133085e GIT binary patch literal 75 zcmV-R0JQ&j0V^p=O;s>6VlXiP0)@naf?|dpTS}HBPBRoxJ+|Wc$*_3<`%Nk3IM^B9k;I4Bs2g3 literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c6/2785528127100d040a68f5d79d009bed49135e b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c6/2785528127100d040a68f5d79d009bed49135e new file mode 100644 index 0000000000000000000000000000000000000000..cc7d4d06b504cff265bfb01580edff8d4f4ef0b3 GIT binary patch literal 119 zcmV--0Eqv10V^p=O;s>7Fk&z?FfcbYRS0r*bn$i7%S~aZsgQ1JEIzTCA-2Ds-?%kY z@&->RP?4F5i9$hsu3klM4#N`h7t50J@7~e$bUnX}$MzzJ!10eJ20)-tT$IePeABNC Z{>77~D2h!HUt0XU_NexeQ~>gND4il5IWPbK literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c6/bcaf8eec5fc02d39ee8a41d4472f4845f73f9c b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c6/bcaf8eec5fc02d39ee8a41d4472f4845f73f9c new file mode 100644 index 0000000000000000000000000000000000000000..884cd2f8be01ea890c53b17a510fe88d21209a55 GIT binary patch literal 46 zcmV+}0MY+=0V^p=O;s>9WH2!R0)>>++O3%ju)KBrz}L(!Q&01D3! EwvXx(LI3~& literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c6/f91df8111ffe7bd0ee8875fea6f7b8d9f5d31d b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c6/f91df8111ffe7bd0ee8875fea6f7b8d9f5d31d new file mode 100644 index 0000000000000000000000000000000000000000..21a7924e34a9c1244054995e59a3e82706cda4d1 GIT binary patch literal 79 zcmV-V0I>gf0V^p=O;s>6XD~4U0)?!^vP6ct6XbVmu32ov!Tqq{e1Xq3+n)Ws5b2`S l;{4L0F1Ig& z3>|6U&nkqbQ|yDc%g{)N%r)0OIK8ODj%r;sK(%jQAl;;aewx8F>%&Q! zO|yLlxth*Do?p)4D!sT!XY=VKgYyd*pU+OG^Xd7FRv#dpeT7fc+37wYX-4kgZRNNE zvQe|1m`Cw4WYK>+21`2UwXaa=rB+m$DQa0D6!r$4p^BhFx7MD0^+YgdN~K=wAVb{x z^BT5X8YKzoe9b^PuI*8h5DV)9@hQZQ+UOwW=)=+DZC4wEPF&RHiYnO+^pzt*ODEUZ zSa&TJD2*3Ose*N_kcOUBBqh>1*oKYUN$@D#+8_ea5Xzc>w?Skv!3pg@V)u8jDs7!} z;8GVtk-#R1aa@h#;}~Z0!`DStY61Cm~}+TVkB*NQ206 zjsFjQ5F^@j*l9w3kS%}g@T|1jvNQFb$`vyH%xsv|Wl7hMJ0k}hX*V#W7u_2s$Gdtb z$GcRMs$NjbLA(v@3U!mLPEonG;>Wj9I^8rTZ?J0~?vkW;{QC(cJu>x12Bgu)X8mms z%@5utu1^F#Wd@WFrVs)%po|;hH&*8i&$^#knft+zy3N_f!z9i-qD*Xiy^U(~l?(%e z4P-PlO!4hI+(Dmb7mY5?QLd~H@7~a-5BEc%{p4pY%ekdVtNp`MEHGR;Js8r!?e#_@ zm{WImql*<1?YiW_W02aL=9{G1hD!1<-n{S!979d^-bq=%4o!0|Sc%LNq J$uHEkMR>Idp925@ literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c7/2b3fdf5cddb3642923df74e884c5febbdf82d5 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c7/2b3fdf5cddb3642923df74e884c5febbdf82d5 new file mode 100644 index 0000000000000000000000000000000000000000..966f285a41c2a1adfe9cf60b0181d7f497fc86ba GIT binary patch literal 79 zcmV-V0I>gf0V^p=O;s>6XD~4U0)?!^vP1@c<8OWo56_vtf#rP`v(>?=)3_{RA<{*u l#rdU0$*IK*?}GB%x__|Dv9i%rJ+u7OSNl?%hXCNe9Q2O(DCPhF literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c8/79e5145e7854ab3f74644ba45060a1ffa174fb b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c8/79e5145e7854ab3f74644ba45060a1ffa174fb new file mode 100644 index 0000000000000000000000000000000000000000..624d2c239559a6eb5f7cb74e2560827fa2d72d0c GIT binary patch literal 592 zcmV-W0vh4+eo#T8F&MV-<;b-XmCOp8{5MCht&+Jlqa1dCv2w$p&B z{`Xxc*_N$RHy#kS@BMtvxh5%f0@LaA>RoWg;0)%vIvQDQ9b8^a-=EXh6}T;ercJ3t z38HpeZD`&9vYgs{=bcPZSJh@-Ay zFOHzJgW4i7q=j6T2zW@bav&9?dS8`Ns1%`*Zrk3|Q@j#*>=`<7g31LoR7cSHun>gn zMT7rrovZAJAZVI~i&iq%rU=T;kPYsl`C=I_&PjIPcCSjb77Tu`r6J475ky6@Qjw6@ zQZ#Kog+V%V+RJW?bW#-)usU~*FzB^r(mErP+WnDQ?*_>Guz+$C3dUg!Q9Op5FplDh zhde}^PpkV4JcR3YxZFgG7*=bTua>vbCR#0N^%275BYcjQw-Z3hjHZK!%6JDfM(Oj! ztPL+lANsF}K~Cp>Z7WP=E>p6midqy1g?>V#$PrX%_R{*fS`wIfNu}INCtSPr`!x)v z6fj0P?>s2Oy`C{fDztH=r{K0S#LbP^W24QECt5omx0_)XvM0~}*+MT>r&{H*s15dj z8)E%0BrSEF@s7YP8Zyim%1?OSQsZ{(O&uLVq038o;7B@lqGv4H#hjv7j{IMD2LIB> zu3umHb8iS>Rh`i5gR~Sh)S^9tU|m~@aC8@(|0!hQfLU54^YgC$=8 literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c9/88291c460f4c44af053d1364f62ff5536c51da b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c9/88291c460f4c44af053d1364f62ff5536c51da new file mode 100644 index 0000000000000000000000000000000000000000..27fc0061eca7499fa98151f227fa4edf6fe7f177 GIT binary patch literal 570 zcmV-A0>%A!0gY2lZ<|06?bZ7$Mm{-_vpA`GXnhHBTopCKl5rYERSydccxBk7yGyWD z<-d0pqt>ktEeFKT$J_Vb3~8lPxSn0VdlOtTxP*mn4n~$+2RF0pw^#If4{nQ~DJYew zK(ubF4V{NC%c;$GKFAD}#T;6dqv@N%Mr71GWTx;1jg?x#4WGfpqmGBv_+suM4!VU} z96)IYtwq9+77AG*;6B5~fmD#`x~Zg48A2!Bw!ddU@l4=(z|g4^R4%BYIe;!s3qiPn zH27!hTw^~3LDzL$^pv?aWl$Xj+2A2sEaPN(MYM;uM^&McVxxpy!%P>x@iW_lIkP8X)bb1>~DhFb)%lk}=$cNt8@I z$WyfWw0hjYQ@CD-@g`a(uv)`n72ijjXcg1xBZToYe2(J#DIj@9)4_dXyaF1d^nPOA zo0p(B{nx~xpu9iZ1~Xa6jHIcu6(vHcU(hI01Pz*6T0d7y1anWRlC^Zg^`YO}a5ANU zG4grmfpV<%oH1gdjUzrKw~Zm(!iX9>ZFW4>+VP|hhDVb<^8BAIw5dANs*q)CZ~(X? ztp5ecD&6K>p(`r6=SUzs!7UmR&X>whdfCU4K13RBk0k%PgWaANv!+dHTOg|h4dDoL zLJNK{HX2H-H!_14Epz%eq?#nOGOGOg4TLG}1(l9QXXbFzs>vBF@2{I48|Q5F%GfLW I34}afBY&$BrT_o{ literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c9/9e2fc8fc029d166faef69c43f1547a5f1974ea b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c9/9e2fc8fc029d166faef69c43f1547a5f1974ea new file mode 100644 index 0000000000000000000000000000000000000000..447f8fecc7df20b2d459a25ca2982289b77cafd2 GIT binary patch literal 960 zcmV;x13&zD0o7JbkJ~m7?bZGjtkFYzptv771PiW$w&_QJ-DD9bMX$6(+uWr@f~3}K z1pV(FlA>0!RzRq*|fN%ZrO|=$ofXqDOA5Q1$iVJUd$;UKgqq z_2zo<`O~lX_2NxFr`o7{UN{8SwY_?>;(D=lPG1qS+wHR5Wv0xAT%4VqlRs~7mc^D= z42#-2Ru_B`Z*?~+_Q>muX$EHD-ra{=@+v!n*z?&8f%7XHJlv>)xsX>I>-bINEi9xn zGI_FP+{7V72J1yWpV3N{T>cS(=i!Kw!QLE;q%fbQ$yqv zJO(o`FS#v@(4N5jEw2x2$FxUL~j{Zw~~w9=oS7nTGYtY=j~Y z=l~DB@(#4nd4^bre89DY`MWRuTUopP*MJl-cYDoqttv{wm(P7hZJ}USR9YFRQd|X8 zQ0_h~U;Y8`-o}6;FAM`dLEe#|G!?Q{BP6tfYD~d@X{SdXh6gYoC&#pnujxH|WC>Y* zp1r1Iu;WdpNXUOPoYy;1Y)6WjG!H81rQcUV!qXA4kM&PYeYE|DN*z$O?=Rusq zu!pL9aR`lCa7uE69(3G-9D2G8nuzjadT%Hcpk#1XBx^qwuLSU^aUo{Z%-v9Ey3{F&9o%eZle{e z=$;!}Gi|rZ!DNBWP~Y$%{awkm$bx_!Y}_0#BN#of_kd)%_jG=YIqGL{o25^x#tf literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c9/ddc74c52f8c038d04851fc3feae09f80f54004 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/c9/ddc74c52f8c038d04851fc3feae09f80f54004 new file mode 100644 index 0000000000000000000000000000000000000000..a4508b18775611c6377a3b572d9e2f2b5628613c GIT binary patch literal 46 zcmV+}0MY+=0V^p=O;s>9WH2!R0)>>++Bx^9Y!(M5LwwXvGM^bT& zVgG%Xq$typ5;#MF4)B9XolD+x?g#Ixk}LG`)wkb$LEk*o6}soz2-#dN&a<-x;!Pn- z(QGakA3ywzUoYO|bE>qw<%LCnZp_7l5toatwd#V9-ENodUS?8n$cwYHbMoi))w0;~ znqkox%bJ2Of>m!(vwPlTOfi6YyPNmdAyyT|PLOHSXx4f1p#(OO_T6*H>N5_|v6zXnLO!LNq zqED-}lG3IsP08di7;;8iu5mbbAkaaf7a8Pg_QS__S8wt1x9@M3zrO#F$}^*ySCBpT z{D#>r$r1e$V^m3b*D4gwMr$o=q`8ttSgH32W0x49WMJfVQM@UkAoka+VH;jYswM9} z2yPsACt-y8_0wwjggBA|PDoNAjXv&AhP#G(fLTn56LQA+Y4?ifO4gM4f6n(AHHCy- zQ7fq-N@3+$LAX;|F8oKtlZ_*ZTw-WA6G|Zn6gx<^YDEQQBU@eYpSn(y`$hxGhb}XX zaT#{Y?pdsc{5*S2$QriXu0o(&01_)?PsAt97KhCbE{hzJ^WutJ(qlA zZ0dge@1&%p6Bz#XZ(wY0{YKZ^L_f-yhAFd^7G5IQbhn0CqZ<;IhtJ(?0f1Ild7RJO z$=xWG2}$B{lsJ$-E^dW*&nR!$s^VowHm*FhH}_adj@>@c8nLKF1+kHhdr+rnTqoa8 z;?W;?0+BVV4211;CJC_+AR4mp_c*%5uno3Hw0mi%S%2Q(O*ua#I%3r8{(lYR1gltu S$KjjLVL!}2`TSp62b1XXy!i#iE<|H!!ZbH&&5oD7Uz{3ig3 C@DnZo literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/cf/9e6dc054528d664dda89a4ec647dd9100ab8df b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/cf/9e6dc054528d664dda89a4ec647dd9100ab8df new file mode 100644 index 0000000000000000000000000000000000000000..c7957668687deff75d8aa304e98e70bf050e2c3d GIT binary patch literal 1087 zcmV-F1i<@v0o7LDZ`(Ey-mCpraK;|C2TDm>3_-vs=+<@%5Vt|y4t=F0+GawD97)A7 zhW+n7lA=QYYP?|ux)(ttk9YjO`|ik6$Pzt2d-3ykiAWqUC>%}yqWwUw-S zySSKq{O|^!O)iTuQCi-z$|A6C&H01j7n7y6>O9X^t5vpoo=LsPpPihX=AWk5vuep2 zig{}+Z7VhjyM`SNy=QGk6$LZD@8;b!f03O)?D1%X!1=lH9E>+nwGEDRiH z$K=7(VG{cg8H^{zctjdmGx0|NUic-FZ_JIsXrX1NuId8NWkzWrWv*$%R#M+(m5^PX z8QLhpNFFU=6V;Z_X=Pzw*n_<(4yM?4y5udxwE0t!JTZo?eIkk<{z`Xd{q)}?j|N~1 z{N2$79I3dan&gi|ckmWYc|>$?2Ie(0mFCKkUA$tAL^0oUsnN^>N549}Bu`CUBtcy;{>&)&Ygnf?CmLrTwxXeK~C z_w0t+WnLiiJ;q2#dDkfve51LR4bn_W!>!b7gs~F_Fc}beUKDF%P+zzR>{lq08*I zaSHR|fO4Y76gB8Hb7Fm|l;ELLz}cOAdJDJXmfq7?KgDTwM)Hjr@6_u%6zO34n`W$C z@oKrFu{1Y>xz|ksIMq&MV4!Xt6cby|F4Np~V@i83m;!%67+i6p?4*D;~>*$IxwSXegSNB?omsaTwPo-duf}zCK5* z=HgLV>PQULytJjB$pYGVAqF<^UHWi+gdPa+fSV4>uSa_vqMO124QVz1zSl= zhF;#FcVF0EW=eE$FZF#f436lDyOKYsd4I{{;CY)u*T8-JP-Myf$Xx;Ejw=ML3b{r< z`piOdZ#!cVMGi88H$W%YPko|6tx1ML+_3vl_z|gOJLii|`?pH~4x~cd!s-s53jP=B zz*WMoZF>Cp@2DhsPcZxrcUEjI!$jX&`0(^FEmdYIE!-S1>7s_WL4T>w9+&&K02p*y z6!AUfJoitZjLTf`(%|S53wWRjk~@3vIWC0Mj|gjNDOla(jw5fHZ`hK26Tu_G9Y75i zkS5u>yKo<(X|jGiq`~XanC4U%NalY73f?M=nnRG@535H3>YW{tmw${Q$y1OX3H9|p zKBA%^x2AWpIAni+5@+9vEcfBq#=HY=5YzuaqW=ouH!RmZcw!gb6zLeI!*jD3e+E0< F23U{h8-f4; literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/cf/c31ece4da4e9928b516efe6232b74ea68373f7 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/cf/c31ece4da4e9928b516efe6232b74ea68373f7 new file mode 100644 index 0000000000000000000000000000000000000000..3d55b386db5976a4cf7173f883ad05f0818309e2 GIT binary patch literal 68 zcmV-K0K5Nq0V^p=O;s>8WH2-^Ff%bx2usY%%*jb~EGWpyOinDx%+J%yN-Rrc$XZhw aYJBc0d(_-Rc4~LK{~k85{SN?6!WRRCf*el( literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d0/275e2ccc66fdfccd9789b6bcdb60c794f8a7d0 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d0/275e2ccc66fdfccd9789b6bcdb60c794f8a7d0 new file mode 100644 index 0000000000000000000000000000000000000000..e87e698952d382049d748f80e2d575fdab22446e GIT binary patch literal 2996 zcmV;l3rqBP0mWHubJ|D}zR&!MwxAX}Wh5t6dv}#AxnpgTkTu`}$KI`Y4}>&;5+SiO zlCdxGf4`?^Mnc%WtK^ca%ho1h)YH?`FHgT{7N;}%%b$Pz@lW+VZx$t&nrHR1iRMIL1QIIB? zjAnU;h1f78e<6ifi6m1l(O3x0eK0)l9d~IS#k@U?l-Y*kH&M0(Nu+3#%8xV$CqE1$ zKG=^bO0clfVql*X3txs&vcSRXTNy2u8Ks*LOqy|F_-cgDT(Azk*)-wfZK(`9Eg>I}|%-7yVEbUYlK^v-+3 z0e-!r&fqs}{G~TIIV1rufOm%!oB9!io1RI+ zmZSn1t&PWw3cGg)7j*4Q_54vGut@Z_bJ3Z+8TPx>qBspqpu-V;dVBHD2t*@iFkg<@oK4vl*lSawp+iN4Xt0n z^h3B=KhLC}sC6o{c9>068hjMlp%M~~)xJGcIh-yD@dT7&Uv2;O=m^nQ-eder?`$$U z##QFAzt93j%EVvlYwUuSwMt~5;e*}r`+8n9r}xzQCpitHS}T%6ztanjoTOGGGDLIo zL>733JS73HL+;KyY?(*ZjZTBz$8+u83U{;l{(H-Snbc`GrZRX{zGiJB(i?DEnyhk_ zO=u>xrC?Bt4VlaZ1H;^pm2hjp?P3!pZT;&-E%asO*9rizF|TTY53F{kc>=eZI`Bcr zas1os%iiG00a+%R^@|sH)9(#lU*d(~!0USXM6<`bJ%?X_y8Kh$`9Y^?YBCuEX9ox@ zII1{XNR_cmFv_tOWkywhkVeR=D>;$Y;wtUQjti@rNARy><7 zm3N#=iFD7nvEx6b3_B7)po&VWg5DDq5q-mcv4yJkH;U)I0jyO|G!9+L`IX9HjTp5= zGRytAj{+)6#Q#$vUm%iqjGB$Bvv1UfQ##2P9C{BNN{v784CBArud9ao0@o;9_6wx> zJ}S5&$IF#OH8vABBJe)I9VVREa9InpokfOy(U}+!(N7(jITOaIr zL!HZdmBs+WI7&V$B+kZ>E|QS}e7(kqsk01f2<8peXQS6`r*Y(PLaGA_fqteQM}mOB zC}+S=-L5oC&}^1mr~~7c$cor(L1yA7a&^#X8Zun3puq-B<+)Fq^pd<#Tzg3#$EAMxG$T4Qcl7B3=}bS^S5wqooU962 zyvCMRn>FMf3_BF+Ds)P+Jza0YDX&=lwjZ!?U8AU#|52bQqB(@Rr9S{#D4#`G-5RhG zN<$$r6wLLD;!GC3P9j*Q^iFZ^T0KMGLd8aH_d0q=Nyj=*qry*Aj*fBdXG;|1ctZE_ zZqWOcJ3cgcNPc*L#gkhY5)9F2WND6;G-L;Am`q*NFT|!ys)BM3gG?12UZzS68jQFPmfIT#d}XRfEd9GUL|I{ zhlmBZ6vX%CdQ2=`xi?H5y0tKSK56Z6jRSQRAo9rNwfeRjcC-vHusfI!6lDN_T4z(8 z-~xkLsLi&hWzOAUQ{0wX^Mc>@{gqQnpz-X#kep4fFIs4@Sg;yoeCElSg=nhOkj5E! zb9t3}Wu}G^EgAme$lN9{cGctl3Hw;-DO*RZIC7Ps=(QMwN)iu=5_3JR)E#!LjXL#y z?jzZ8Ne$oX0434EvcsV@#gwCH*wIk{VY$f=WvD1EzPT|(MV5U0Oifm?qP^Ml}uT>=hq}ko1oB1>w~^6Wj
o0Y}q}OXiXYUXp|pUBgcJ4PNXY&?mSv zhjOf`vDR+vbKWhNH#=)Z4eK;`-J!iUHNB=r8e7O3DB=Q6Q(!g&VJlF@*kX@wYZ46t zSOZ?0DT9u2l*{H|T@&!L=emx`=-8p_&ms^TpDe>Wr*_943|(NFC=&dSIxmj7g2$5{ zE$T_UA(-f8s{|wW9CAP1&A}!v8~d50mZIiW(j@-xCrx?4umpi|teq5?ao5>s__lj| zj!AU)q&I3eKAC0v`+2Le|Iiu-ceU*p5*WB&l@g~t##yV^`*6KNm~;2z9H9O!XPIbC z>U3sCGw5TSqF9LjDME)f_y_=}lLFsCgq;H&pY~7~FZink>fuck$KaqHReRnnMKN1o z08g}&G-(yT4F>YC+qD+~5Kc~egYKj=dOgOCjAWR=zv{iF#^0S?o$XN9YL}zV*;#kA z3ug8Ug!W>0Bk^Sc;MM2h?xp$B$2Sewf|~+oWGA#7ko-{vNEe{tx#*6@nE%7kG2IJc z(Y>EA@ddi>9pcfm&ta3w0;X{^_15Xiy;;Tdnec6CP0gPy*Ctk$D72{c6i>{sC8(*; zeialiJw%9J1b4gZrTe6@x7VZtE9yD&=bXQGQ6Vfs`hDY*mG$m-m=YeU@71u2I8JC; zT7OWp|9N!WECJU>MkhcIiar#r%$2iZaLLfOp`rpp=&wecy6u5&)LfSFmC3c{Fk>?| zU~zRESMs9IpY0%f$HbbvbykwW(nYPNxt<9Be=i!!#;x$M_9OS%nyVr#%ypnsDmygd z&Q=)?T_M&h(WQU4%9i3kMyPdFGvsa+j{Cs}gfdsBbz)q4$(1wE!hFQIbGC0*d7MT4 qG|Xdxh-Q30DH2QxFT1FN-CE*L_ao_!3Or&v-9d1K;=ce=mBR}34cmGE literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d0/5539d7df6f49c364c57341c3d2fb6877673e92 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d0/5539d7df6f49c364c57341c3d2fb6877673e92 new file mode 100644 index 0000000000000000000000000000000000000000..55cf056c0c12ac24c249afdca67e72b9ac2fc088 GIT binary patch literal 74 zcmV-Q0JZ;k0V^p=O;s>6VlXiP0)^bf%shtoY!15TxzkmTzu}C#GRH>;zk%b4ja0CVLVY8Qbd(f|Me literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d0/69204c871c6337d55164ff95531a2a6b8a34f1 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d0/69204c871c6337d55164ff95531a2a6b8a34f1 new file mode 100644 index 0000000000000000000000000000000000000000..e6df40bea1b89f2d1bf11f88f56e6c7413c7a3e7 GIT binary patch literal 97 zcmV-n0G|JN0V^p=O;xZkVK6i>Ff%bxNGvGG$xKcx$;{8wtIW+|m~t*ubz0m%p=X^; zOFd=XwM24-vo%SHq D&Pyx) literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d1/0e78a634bc9670568e336a20665c68a762aac9 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d1/0e78a634bc9670568e336a20665c68a762aac9 new file mode 100644 index 0000000000000000000000000000000000000000..0c1e989beeba0dd7fc815a6685d7cfa2ec40883a GIT binary patch literal 888 zcmV-;1Bd*00i9J%Z`(K!-K+E~20A&dOZV&21`9;BT~uh+E-bf3_p+d*vCLK`RenS< z7X9xX(n@M2yIFK|a43p1^X9$BQPHRZp1pec;< z5EN|+$s6F#?v$qIeq|Vi`N&IAqBK~6lNIU^l(xL2*#6BJKA|>3NqEkl!pLV$`d7)> zxleIW4)**2Qdw{YDTgqy6%7Jjm)Kem5=ymi8^L9X&b^0tG34HEzsKRnO&MBZh zfZCoO1a5oK;Qw~kw&wL@(sdo<0Wwp%o;1gX%;Ykg&KLRo3Bm5eKFS7-0gd0B(A08q z0NxU;k{1NF;a%XT)=2NH@~}HCtdR8>jN00cYxGzvVXPK~vjf)pZh(3}JwUv12}znm zmM8Eg&9i*$lWel}yXD64p=PCUHzWfAxtf+^h3ACKO6r!c(&^P72G`Xzcm@ZSAB)%~nossFPu!X*B`b zYQD!#>94FnE)CoA(kgvmT#~Hip-Polnd6S3r2crGK*s@Ws zx~WQrEWPpvHoI9(1D^kr!e3=&ghe*JS^Y}ZAkB%YGoh_OGd+s+AfSP&!EY~namiTZ zub;j$-ZJHhFH=JtTE@e_`8UTKb6e`+!)xtGrTC)v?&#>IV?pAVGM>d3LyL__vlExV z?=Z9tqZ>b4{_)p`MLIBzqT literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d1/b1761d11f2184bf161358678a0368e7b698e0e b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d1/b1761d11f2184bf161358678a0368e7b698e0e new file mode 100644 index 0000000000000000000000000000000000000000..be5e05e9c4a78ad3cebc34d854a5506b3ac1780f GIT binary patch literal 964 zcmV;#13Ub90mW8LZ`(K!?bZGjT%(8fATddM2m(gMw%u(5ByCV9#a?NNwwXvIK~iyy zV*mRNNl~Hvk#*5S0UtziW;pN7o1tg5oS`?zrzbDSyT_(R4@?^_#rfnoKbjyWN?CES zIG^0!{GFXn-W6k_w7g@bMPMz=*`wj-lclxl4CB>mm9O69QZMky(a|yf=jw7=E?Gk} zE{vt3WRu|4do=WciJU45X5R1m>lJ>RAHm(@(Fj5CGvgy%%92{2S9jNbPvk5Nq_bu6 zXsWQ8`73f*Pm1w~G_qp#_W-=`M+6V{#$dG2vQ-yV0qAn0G>|gav|%f$@AI;jZIv6^ zsG1QREy0Ou%jdMT;1_%{Z<+YBcpw(Fcc+;MCMzp{QoU0*BA@Gn3M$ zyzC;z*<_#+ZJEwO+zn=)s5!|&o%#FQi_4GM^vj>u)6ZXTQeH+xvl{gBz^&O?Eqm5ShPyWT0Jo@x1H|I;v}?r*B^!eMm&<)bOetZPH%e-#QdoIZ zQ0^3#EB^p^vN52@2}46n5Pu*j&WwE4@){aNwz_10b+e`LqXn1`b7i-UQ`jASps@{# z@@c(NYYQ05b^XxtV8`{%kLcy!*cJfcGN$RCw2`7 z5a{sgP38UnnEJ^~1hey+KW3WGW^!{@{aQL(Q(;#Z490?G1{9jKikE3nY&h%H`%6Uq zd}b>)+e~aDgJkJd1hVqo-~>ce-NF>_hDlf)Fi5u3+{>VU3$qY;Gf_A7{QW`8$@j?3 zO>@r`0@c-Wjb7O$Hwb=rt+9wAM>>M1vaQ+cFhSiwNeUG14c_~%ACXduIbXEeKk)%L z^fKIASlz;l>OWnrA=Pc$H2wJPs3f=}7(V+!A3M0;=sKA9FSHRgf0V^p=O;s>6XD~4U0)?!^vP1@vb6QuJG7@jheiv^Vx_YmGT2b;8h;&hE laeir0a%wSy&~(4k6>@*v4lb;A-JMud@_u2L7y#O@9M_*xApHOU literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d2/9e111c32367e21b9de99cd5bfeefe79d8f7d00 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d2/9e111c32367e21b9de99cd5bfeefe79d8f7d00 new file mode 100644 index 0000000000000000000000000000000000000000..c0471659dd9f8084cb7ad5ab185478354191fe39 GIT binary patch literal 82 zcmV-Y0ImOc0V^p=O;s>6WiT`_Ff%bxD9F#%tH{k^u>AB9WH2!R0)>>++9WH2!R0)>>++6VlXiP0)^bf%sd9;GOr)1EN|yC%)D~hYZX@#v!47Eh;&J6 gaS6kZ=(R_s*;}twUAT9!{ororv}Hf|0ZJ|#ZgVanZ~y=R literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d6/2d7aed004b539d85387036cec843c94b41f25f b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d6/2d7aed004b539d85387036cec843c94b41f25f new file mode 100644 index 0000000000000000000000000000000000000000..492040562d55c6033aeb1f0ca2a0018093f97d14 GIT binary patch literal 65 zcmV-H0KWft0V^p=O;s?lU@$Z=Ff%bxh$=13aV#jv$xKcx$;{8w%StRuWVpX~@zl}_ X79mEO{Y9_uZ20_YTlQ}NDYqB#O&uLv literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d6/c7539e9c1075e79f47d1bf389cf0464654b93a b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d6/c7539e9c1075e79f47d1bf389cf0464654b93a new file mode 100644 index 0000000000000000000000000000000000000000..1c0b9516434bcfa573bab17af8cd0a99fdb797e5 GIT binary patch literal 75 zcmV-R0JQ&j0V^p=O;s?pU@$Z=Ff%bxh$=132`I|1sB|nS$jMAjEXmBz3rQ_5Db~wM hEK6iay1nAMt6%f+X^b;{9`jpOrlst<0ssLP8OS{%A29#` literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d7/b217169089c4438422364195b26fabb00e7000 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d7/b217169089c4438422364195b26fabb00e7000 new file mode 100644 index 0000000000000000000000000000000000000000..4f4e1500f9e174bf70739e4ec3e9bc676eb9f615 GIT binary patch literal 46 zcmV+}0MY+=0V^p=O;s>9WH2!R0)>>++8WH2-^Ff%bx2+mANO-?LwEGWpyOinDx%+J%yN-Rrcux?-D Zxv?hDT|wk&&Jh8{Gf^ literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d7/ff30558d5bd6c03f1fcb0630643ffb57b1fdc2 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d7/ff30558d5bd6c03f1fcb0630643ffb57b1fdc2 new file mode 100644 index 0000000000000000000000000000000000000000..9afecaa401d29063d573bf6fff4a030f73c2a585 GIT binary patch literal 46 zcmV+}0MY+=0V^p=O;s>9WH2!R0)>>++200Mjt Ey0Qfo8vp9WH2!R0)?!^vP6cp7yszIjZZnLQ?p6hL$}@3?l4Cs00!I+ EGM!ly1poj5 literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d8/e74115f7d925992f7afcdfdb099fabd5b41ac8 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/d8/e74115f7d925992f7afcdfdb099fabd5b41ac8 new file mode 100644 index 0000000000000000000000000000000000000000..fc8431f6448e48817f8c32cc086b18338e8a9f4f GIT binary patch literal 79 zcmV-V0I>gf0V^p=O;s>6XD~4U0)?!^vP6aq_b?AW#(uNwM;$dE9^D^mKG8u6B3+bP loL^d$oLbCK-^l&#;I0RpzDsK!)x2x9(c<VOC7*UR}{lOP|``}B9kgf zMK+55_Z>+&mXkDVX9SKZ@{Z3v_uQS*N~Lh}^Di%dh>s#Tf^$`GwJ28>PL5yx^n$*A z1G_>{^iW7%0dMR|XOxXch*VORd1&Wl3=A3Gl^wVaM~ zGN`wpivB_1wgV0Bv$D1}zsGUgwv2noOzASNLO>?Inx9`TlFJtayEA()D>Mc)erklK zkkc*jnqXx-C9oB5JwK&J+Ox{RZndyNmJ=|lur1f)cA)L*Uc`|WMKFn|4UcbMA53}WRwz!#JCUCuk^XtXM{APZ=pw(-bEk42@^Tovk zkT|34;HK6t0!pKBd}8j&OVE*ipD`$C->prJnJ7d?p~EMK7KZ9tZJP`?qNM?u9Rho_c;qXa^(HD2^FKtlq^KqXzU!Ek*{xcl2xk7Sw{Jn zmXX*pm(?x1lupMNyY;!>e-=$}w95}^I#rS_{l9OvRyE23MJc=cU%TJInsm?!qN{mI|5oZ(LFjL1W)h{~$&E4|8J)fYqw1 z`XV(>e;L*HW34`i0;##@?9Js3$vr;ueSO+>{Djg&^#*S!t5oE1G!24%ptorHqcVcfy5d>u=z?G-Gl$7(6Ov zrW-lxx$WH^fKGz-X*Braz#OV#G>nJidjR1+@U)D=eHv|}X*PyJ?sj&*dK8a3GRc`B z?Q3dS*eAs^@#ywDUNt@wF=b)xB|`L*NXX6L5RK!B0-(P*2G?d`*Qdj@F2sgro$(!& z#)Pqc#B`{jR)osU6q=d1;WU_#Q5TP<2bqm}x%_JSLrz^e-}83R_Cb58^(R5cB>_({ z>#zcmOm0bwCmXylLKy#%S--g1YsQtGy;!;JJnO^6cbp|SpI!m`+hle#PjB86?B4C8uFyHK_;;f$m7Hxr z)&wh;8G)^28~7$-rEjH0##$)nt;!mIz*=7oQ0@B$#GBMGn5K}V z1NbmalXT2M9+JiHcOMtZoD8)_q`xB$|3)>*sUiBR@ z>@?~?5dUN}imwiZi?3eE7uQWj2N;42bcCd6Ni{;oC!5=uWq0sz97k8X9*UzQ-uTpZ za&JW@bM}m*KF5<$1I_H+`L_FCtVujRZ{Sv@sc0%=pPt4m70}VfGYV23dI&pAz2moT(9y7qy|d_~WWJ7; zh&tiaKS*+1Ucx!C@fuhjqFqqJQf#R>!n=}BNEg_&kz%(thiWT z&%S^An7y98DW*hedCy9Vz+0HBN5ijY8*9}S#=G4v-@VGEUgOL8`~v@Vd$TAvtf3hf z#!^wTS%~T*8v4LQP89_=A9wfl7XO;h;qK{Vg5dBg<4?GeCAB`U?yjdJk@GN+&WX#T zse&={SLCps71If6WX0+~1MtFc5j?O>!D+2!tG-kPpv#TYK*~zfhV7)@=4CD0DmS!I zH6u8BLJ-xKuV`r@F2rQsH4Cm8Yc<vEnPK(ZWMV?;K)+Q&)GDq8g9@r_b}X zloH?`cp4+h`DD;F+A^JmbB`E0P;{9?x8`rZf4O;|Eq?#)Zt?l+x0Ig=(X594d0=*1I%d?}cR`XqtbN+P%T?XN*mYG8i>~6(VP?w} z0*-3AM?c#QHwgajTVoMLmcc&|nYL!XgkE#hCsp_A<;o4wSvYy5-lY^PzHYS_$8a;C zhIdtd!!k+`ZHYW>+fOUeR z;Wh9lg?l;1VB9AAXW{4%JOjvz)&>OWd?X35P@qnr{)lgMEL%{Q-h2YPr*<6mk1gI< i^2b0=5cRzOUkf>cDhhmGr!a<7u!o1fnEneWRx=9nJ=}Ky literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/da/45ffd998e84ee355486272a8bc7c9f011f1931 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/da/45ffd998e84ee355486272a8bc7c9f011f1931 new file mode 100644 index 0000000000000000000000000000000000000000..3419bfbeb3144d6cd82787f1e483ad02b7d3317a GIT binary patch literal 65 zcmV-H0KWft0V^p=O;s?lU@$Z=Ff%bxh$=13aV#jv$xKcx$;{8w%StRuWO&i`=WYD# X&@Bch=P;ERA6l;Tm}?3EDx4N1M%Wtk literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/da/89e9eb81c8b9fd50162622ce4ce77d29b7abae b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/da/89e9eb81c8b9fd50162622ce4ce77d29b7abae new file mode 100644 index 0000000000000000000000000000000000000000..4959e29ab294191ca3d95dcd50277f10f0acfe79 GIT binary patch literal 46 zcmb6XD~4U0)?!^vP6a}2Sg9NOT2qHr~RbPQa|$yZI>r^A<{*u m#rdU0$*IK*u0Q8VzW$r@HT=%~n|8Tw^JB!grUL+1@E@^J!zPpf literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/da/de0b5ea4e845215c9ea3beff809f726fc3d115 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/da/de0b5ea4e845215c9ea3beff809f726fc3d115 new file mode 100644 index 0000000000000000000000000000000000000000..1ac85d11e7c27c240c56dc4285c3b73726f2419b GIT binary patch literal 74 zcmV-Q0JZ;k0V^p=O;s>6VlXiP0)^bf%sd9B5B66*YR>sQu4kNVIr-0m2Hyx~h;&J6 gaS20r^_rM>6C1_CH~#*}+z@hRU(PKd0Cw0M0bOSwj{pDw literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/db/9675712bc480a7ebbf9d02e0be1bfb8f9406e8 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/db/9675712bc480a7ebbf9d02e0be1bfb8f9406e8 new file mode 100644 index 0000000000000000000000000000000000000000..faa5429456d902838230e3ab2c2e28e6f3156d07 GIT binary patch literal 617 zcmV-v0+#)F0gY49ZksR^-D~_6S9xly6x!}(TV6_2s-abh6w+1IvDCaDIOA?oE8c-~<**?~G`+4ld5l-=5OzJ-97`qN0$z z1>U=@GPEAQY(y}RycH!%ixu>;LK8rV<|Sdrof&*aV}+7%5uL%2XPu5))8o0P*r^^m zz5}To^cIOjSg1vdfX^jr2SP%rI^7B`ON2qVZ8&FS@k-!fI$Yuss)o$Phz1B)tXGGDv-%=ah0C_)bpxn5GX_7;hPvI)bvwY@B z?z7Fu)!hc}ll3}TZn89o)fyJ7<#o2nR!dslK(c&*PucQ%21uFFbnsal?|{ZAe4bc^ z@N)E_|C|`qwC~qeV<~D;k~P`%yg_Kx6Bei(u=0{x(Fw<0DE+z(2UCg} zqnsZ-QH7nFGe#&A{IAMU*>Y=-+2uZmKWs4F7j*d`G(liUDO;0C>$r3xFdx{4?~F}G z40SkyJ}FVrzbE8TPFGSkU%mo2jXkE;$>de|k?G}L>0i&;tDfzd=4|r9*bDmsRR4%Z DdHppW literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/db/a0f15d476fa0aacdecd78a20ee22473b7f4be0 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/db/a0f15d476fa0aacdecd78a20ee22473b7f4be0 new file mode 100644 index 0000000000000000000000000000000000000000..8ddc08106ab2b8643becc678848e78200474a4ff GIT binary patch literal 74 zcmV-Q0JZ;k0V^p=O;s>6VlXiP0)^bf%sd88|4=Qjr?Dn6vC9J5>(kclUURSkB3+VN gT*7c;@7amJCh8c8D=gMM%h>;eLy%bv08J_xIEZW@L;wH) literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/de/320dc7bec5028d700aeca94104f5563e283024 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/de/320dc7bec5028d700aeca94104f5563e283024 new file mode 100644 index 0000000000000000000000000000000000000000..417f3779f9c01e4a2e62489085bcf088b5465803 GIT binary patch literal 78 zcmV-U0I~mg0V^p=O;s>6WH2-^Ff%bxa4juL%}xwXEhgf0V^p=O;s>6XD~4U0)?!^vP6c@rI*#a>vnPM_^DEK-*Ml9#)p~vA<{*u l#rdU0$*IK*0sC!av;H)MDb+hIO>#Sxyz1xrC;&v*9}M&*Czk*K literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/df/bda39575d0385432298f72ebdcb0f3eab66bfb b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/df/bda39575d0385432298f72ebdcb0f3eab66bfb new file mode 100644 index 0000000000000000000000000000000000000000..53a5619f9e87e508a7b52a16254889568caa12b4 GIT binary patch literal 606 zcmV-k0-^nQ0fkddZ__{!<(mB!qnz3*wbLSmN-lNNR9KWms#8iq9Miu z`rny#3?xN@9IWi@%$xV#?Buo1;bi>w>{Wck;0UI=*%(=^9Gs3%ULVuv4BQGqQ&1{i z1NUyF4W0XcHlngnc`XGhiv@U9py`T|h6}3gZ$|J5jg?x#X*7m|fI952hKG{?vC$sZ zd;>~5@D>R}S}0|WfKLJ&2U3C1>!y}m34~U3kJV?X-IOu0p1WT!E+*8 z^S1M+GDvq$2imQXPO54IR+p~j1_ReZT4!YL-JWZ`8X)bv3FI4BFibK?vmsn0S(=Rk z$X&X8zqnn(U2=1i%$MmbgT)O@7xT+>nJ(sZx`JeW4qC4xnuRLiw=+;yQpuVH6O zF=OQOLjWppttX5T3vC?nsUq7L!YvJ7W2?i_@% literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/df/e8b2e2b511dded4b000ef3816133e2027805a2 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/df/e8b2e2b511dded4b000ef3816133e2027805a2 new file mode 100644 index 0000000000000000000000000000000000000000..e22bb6a90ccb4cfa50b479a1689f40b71367f8f6 GIT binary patch literal 134 zcmV;10D1p-0V^p=O;s>7HDxd~FfcPQQE)9SO3h9TPAw`+EpjX<$jMAjEXmBz)5}UM zOJtbOdt!S2S>>waCGI;9Bz!xRv6}NZRG)uI1{Mu56@PxO>M-N@sXseExAB5QxbTU^ oPz}MExdl0?7*;G0EGW|0V^p=O;s>7G-NO|FfcPQQAo*8&Q2}TP0r6P$S+RStIW+|kP5!`KrVld zeB1JjOU!0_JT9-lvI(lXAU{{H0;uHUp||Wd<<8U9#kPr`^sZa%YS{MH!~h5sii?sN d`a9IzYqXB~{c>95=P&CQ{Mvd|H~>4JEmZ2WK6?NF literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e1/0ae1af5188a84a28ae801c4f6092d1436b5759 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e1/0ae1af5188a84a28ae801c4f6092d1436b5759 new file mode 100644 index 0000000000000000000000000000000000000000..c2d76f3ee9f50904c6238a8a7cc8c4eef45ca8a9 GIT binary patch literal 110 zcmV-!0FnQA0V^p=O;s>7Fkmn-00M>N{JgZxbcV{PeyI}?or|BH&~`hb9{AAG@V6^O zK~`c}BE$Uhw@fVR{Cm_J=87tO`W|MeY{UbRE=n!VFD*(=EoNAj8uV>ZEN94<(`}lU Q6k?_@8kHRc049$o?bP-$UH||9 literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e1/97c261c1a625cc2b1e9d3ed720039d10e75181 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e1/97c261c1a625cc2b1e9d3ed720039d10e75181 new file mode 100644 index 0000000000000000000000000000000000000000..1740a1ff8035ac41de15a13ecc0f47b0b3305e57 GIT binary patch literal 86 zcmV-c0IC0Y0Ts(J4uBvG06=G6;mlB&H1HcBL`je~rFHQ2>UzoLj(Od;WfHe>KqBg` sBxyKcq^rh9wVPS_t_*}MF$C|;ufV8MCujpoaz;1hd&OD%0ti+f0D^8NegFUf literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e1/f3e158e552590b3369ef033686b34de9387341 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e1/f3e158e552590b3369ef033686b34de9387341 new file mode 100644 index 0000000000000000000000000000000000000000..775116b8418e99406ea85c0449723cf24a2b22b7 GIT binary patch literal 364 zcmV-y0h9iC0cDX*Ps1<_Kso1ESY_9y5&{WT8UnEb6O17k2TqlndTk(0s(cjj?@2Zg z0*-c`9s9Xarh$`_;{z93Q^FRNBX%fI^i;A#fL2-(-dIU)7X#!lyIHTQf)7Vbq3!~9 zRKhDx$X?sGk|n}e6pCVa${g8Aid3B*EVa_*DMywyv^AD$shvlq_CO~+2&1>MgAg&U zaUjTM*UL?Pf3d2vU6;QQ4Jg$YRjn?TcmFUEKPK%ZD&CVC$wKDhRs?yzm5Sy(wk&=i zw{JkAH<0z-kFG3=+4W7mS>IOo<$0w0&~Raf49?(hG5fU29` z=qYy^N7ozgAPPebBZ{{u6!OJ@6KU?rd7iALGi+k84t@-NW3JNJ-Uec%r{u1Sm&BdL zB>G#}JX^#*@bp18?ezV$vovpAOrMW(GVuUhnlIpTSud)GyY)-`{8T+A?eiu`)eh)< KJliM7-?RgjF|BX_ literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e2/24749e88aabeb192da35b68821775b7ee40410 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e2/24749e88aabeb192da35b68821775b7ee40410 new file mode 100644 index 0000000000000000000000000000000000000000..faa4132e5a8f960961822e4cbbfcf93f5d16e2c1 GIT binary patch literal 79 zcmV-V0I>gf0V^p=O;s>6XD~4U0)?!^vP6dDBYz?}`n0­mrɰÖVJÓzügJs™7‡a×u¥ËP¼d›x¹Z'«cÂÓî¤@c@㯖k*9í5„•±”`ëJ³Êawš[.Ë9UØŽit¬97Vó´µï\«ªýíòIð£âć¯Q's'rï®6w;¸¶Ûh½‹W l¶°Ü¬/ã]¼YÓêD븎חs@òŒºƒ‡F» +¨Üù‰ù`^‚Îô?ƒ‚ânmÌxÁ3*M–-+JµG-©"hP×ܸ¾Ì’à5·Ì[§áM—BÏ#ŸP޵:÷<¢PÚºîm!ø!¨zçÎ!È”t.?ÙžI²8`’d®^Î,U]Óݤ Ãx1ŽiÒ MІï9WH2!R0)?!^vP6bkoiATEp4j;}Kuk^PoX_)G&F!n#0RR}= F5Qd^m6Z-%F literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e3/649d78d7514ee8181639250a5dd73c9fe0d678 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e3/649d78d7514ee8181639250a5dd73c9fe0d678 new file mode 100644 index 0000000000000000000000000000000000000000..864ac1c8e66a3b65d01002de2b9925bce8b65e95 GIT binary patch literal 78 zcmV-U0I~mg0V^p=O;s>6WH2-^Ff%bx2+B-K%FlDo$xO{FaV#jv$xKcx$;{6SNi8lZ k*2_vPOJvYt?0m<$Zq9w*O*wDo+5S?$c{)xB05;qj=C)xW_W%F@ literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e4/d5c5195faf0ad3b7a16296b9f09e609f95e6da b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e4/d5c5195faf0ad3b7a16296b9f09e609f95e6da new file mode 100644 index 0000000000000000000000000000000000000000..ffc0712ff52265d47553bf7a51ea279a54ab3273 GIT binary patch literal 93 zcmV-j0HXhR0V^p=O;xZoU@$Z=Ff%bxNG&Z&%}&%SD9SHLEh@=OEoM0TEz9%f`X0;8 zHx|7Ro$MR_U)q2Rs<=2aw;(4KS@Gd3GHn;--fjPTb%ju^Na2^YZjna-E3qi7vdJhB literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e6/826a166a1f6823d64730a0f054ae5f354c4f23 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e6/826a166a1f6823d64730a0f054ae5f354c4f23 new file mode 100644 index 0000000000000000000000000000000000000000..6f41c6576a44a51f237b1fbe9d06fad5429f77af GIT binary patch literal 1089 zcmV-H1it%t0i9J{j~X`=?JM&uu6Tlon0&o7+enaI(x7gj0@77fRh4JBfV(sH)b=ck zs{QXh_6)m2w%t_a0T|o&`rLERJ(K1prB`oWzW#3bETLy~ZpwpI+nuLZFJ8WWj<4^@ z@0bi0m6kcl%I}QDbMwy$goVgUm9cibrb@5b#-MR2GsHGK1Nw!nQ%2J(@q&6GYq#0z z_Rm6!gQ=*H2hzq<T{A?{_&zk^yZTiQ?o+Nc7bypH58IgozeG1_21JiC%JwNV*L)7wgJnYQMJtwu#uvMrPgeRTl1 z4v=zHC@+0ndQd~FOT#1q&(|T*nhSH5BtT)T2cE6?qteQY6+3_Sc-dB3vlWXrAveZs&Waf=M2&o~f2uh4AZ}y>aCl@>lH^z%)%sH-`8!GyC2qwg2 zMsL)%vMeS#Xd>Kr-mFCo-%jH}fIuG4w?`Q7f#?x0{|NhuU~$FiMBgZDbiw+RCV(P;0UtmEtOR^ZcdP1UWI{de+W>8;2MWxZmD1cAvX?>%8H z%J5Ai0O$>}dop;>sYsPxw}rNVL70iknrBigQp@v zGOBSOCEo+RE!EOH6wqD}@V<-rr{8~`FIEF8Ei@b3j)Q+Coldtn@U4W?v4G*GMvENY zJKrqX!pGd(<0jrN-2ruLwKs?b#}Qt?+sNE;m+tz>=u}imS*0+4itJKL<-w!sD=u+e z%SBcw(E(Y~8Qq&v(t+39fGb*Hx1KMg3}c3Vc19rvXX>kNj9NFFP`2jGyIwz*`k;bd z9V~X7=cd<>W`cL3>vezF`6BQ3@z(9!h14y`y&IWV4B8$j>-LjQqdA2kvT)QBjG>Iq z=v3O*Y7k<;d2q_zN2y&BlBzhNA8U@$Z=Ff%bxa4juL%}#VID9Fi7PAtjH&(q6FEK6iK*`X=p Y#_!{@p4C=3<(vN3;GDo)02|sA4NBe}cmMzZ literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e8/6e870ff2ca8463feb201028fc36299bd3e344b b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e8/6e870ff2ca8463feb201028fc36299bd3e344b new file mode 100644 index 0000000000000000000000000000000000000000..522e6f391ee150116043b0c4c06befb317fcae7d GIT binary patch literal 78 zcmV-U0I~mg0V^p=O;s>6XD~4U0)?!^vP6dKo5aN?bRKbTQ8II!x+#D42EGEQbWv(? kerZv1YB9q##?>qymkX4CWc+H(@n=6MrhLp60K~ByGsp%Y=l}o! literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e8/86fced5f9b55b430c99c027433c2a722e30a94 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e8/86fced5f9b55b430c99c027433c2a722e30a94 new file mode 100644 index 0000000000000000000000000000000000000000..460d17e409e8453fe174a29665ffbfd895ca8cfd GIT binary patch literal 1040 zcmV+r1n>KJ0gY8_Z`(E$-B;^ZT=(Lz5aw z#de4M_Z>=dVy6kvAP_9-KF&G!!AzNqPTu``@>B9AqBk@))z-?z($mTDyIw<0LG^#`n-|owh{$T5*(R30Y(;!6ccc1!4 zry<1F)U*;?(#BKm7%`-yQYt3i2@@qkEYj?%amqw8qcQhC)bnN6mK7BH2p#!C)4*sVrYiy z@TRhX0m>+Yo?JBIr5r?mtQeK}9^PHWxh!Q4YI;$N1=GUZv(;ck72B0`p{@=9ivUT< zmGr_lM^D|bSEVG1pz~b_RPf52MiEdL>*=ew7n|6zy;tnxP?-1%kF-6Qv#XGXpX|{M zv1VT?xrx8kwTl15#i-@x}&!}>!L;5 z9W_9$ycZt5+#)TTZPucsoB4#!sGqdo`VgphK7+JY7W_!Dv&BAwrq@t((9*K(Ym3RW z27?UW0Qm)XseRaG@SRyK$V2DjSKZKfiZS?ZX=+upd^+C_P$jSi&*-q5;|2S1Z7s^( z_4nW?oOMNdqkG{O&VC4no|cBOLcShThf~z2|2Aq)$K7tHzygDO8x- zMjK2~Q;8k5r<8k)4zvZr7{iJfEvi@5nq^-(_Z0f74RELm<$m)+QU#hxLMi)Z{}o({ zS|M(?fN-f4+-%3kZVH8UVcBPltMeHC$c0S?#oMJ7dbM_AI1XM|X>mIKXZEqF0`iv9 zI#0nv<~#qcm8C|?aQh+EO89(alL|)2Fv2AH!EhpII0c-7c1q8aL zA6j%5FotAjXQXSTTJ4@QXl(jdtdyZ!V^tBZZL~*6G{w|~Vcr2AG&OHb9$?lrLI~fM K@8N%-cjZ&~PZ+fT literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e8/9cb5eed4f8badebb16f3d3867664a83e108766 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e8/9cb5eed4f8badebb16f3d3867664a83e108766 new file mode 100644 index 0000000000000000000000000000000000000000..982c9b67fee6d60e049bd54b26bf954da7ae6e4a GIT binary patch literal 125 zcmV-@0D}K`0V^p=O;s>7GGZ_^FfcPQQAjK($jMAjEXmBz)2qzQVR*@YFYlSMFhk+Q ztiptDgWyZAIZL2Qlk)RRic5+T3&09p*RqC5xf=M-%FV9Jep2`J&o4DIsKVmJ+=84` fu&TA9t9O~o-}s$)=0g*UWmU@)jjyW!^)ND)YHUBD literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e9/5544d890b9a34a25acf6a62f5606fde5555986 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/e9/5544d890b9a34a25acf6a62f5606fde5555986 new file mode 100644 index 0000000000000000000000000000000000000000..d7687c3eb8a98bef5051dba1a68142c8b5b4a01f GIT binary patch literal 79 zcmV-V0I>gf0V^p=O;s>6XD~4U0)?!^vP1?~ACoE-4?(u2kxSKG&M&_rlb~q{kuFLt l&Mz%WPAz75BJ1S;K)kH+akf71<=m~ae|`VB1ORt98~cxLA=v-` literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ea/1571283f4a49a1d6ce43163f48c0f79ca992e0 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ea/1571283f4a49a1d6ce43163f48c0f79ca992e0 new file mode 100644 index 0000000000000000000000000000000000000000..e11bad20e56183ed1d6433fb0bdf00bfb2f97ca2 GIT binary patch literal 96 zcmV-m0H6PO0V^p=O;xZkVlXr?Ff%bxNGvGG$xKcx$;{8wtIW+|=h_=(o?meg4PqVbG`Jzwz(zK#ROeBAJyk zrYfiEUXovk2tVU|Uaf_abe^xWSX4=#(FcEg{*mx173G<<0&+#m92=uNt5h;uRai)k zP!bCzvz$qIt8 zf4~rylg}!FBSQN``CP}%ZX;0{3#=VPbYE3Pd3tiPUa#9i=dYcs#Yt+iP@Y^N-h**) z3=ejWUT3K+OH%UBRiY64*$asRMn+-=(^Ih~jy~s5!vhwr6*7@6T2^;iqokQZ0}zg6 zZ83t;+<;h$%t~kYasl0Xa)DW40)-oWI9BQ4_w=4wkAPTLfgg^ZGU62aAMu@VbOi~LEdjL}p` zwMIO?{qQ#y>G9#gPZ6q1zb~F-_JzikP!(MlbSA3kp2|oi z#V*9c8X&>ohMt5fPpwgx{*6Dq81@4?rZkTXO#rTfF1z38K3_^CUYX7I$gr@bT+6cS z{V)3jEwzb9B?_plM4AGKyHcs|-voo{nLp`VOoPtF5SEm(Vm3RJ<1mXdF79iW)kRvj*Qu;_DWkf98JcM zQV1oMvI3ppv21YerFar_)2H>l%t);=4M3e8D+V=Avb|`tJF%Rt7NoyYQk62Dx0rM6 zPPWu|z)HR2?`He)cZhw6*Tre2L{=8Ls=T=C&zuQ!*$5> z$jLJYnPVkycWg?VbLMgtxf-q@<0p}#X);Xz$?Jy)T8G|Z9gIicN4h! zapX@fT<7CPe()@#RV7iCz=;BY=7>{l3%!P|ZdtmkLl^h4+9#WE>yQJAgzM#FQiRb+ z)v&|J5SeBT61I|C7!o3B(vhM|M=#Vy#n}SUq`KYEj+XJJbYOve#!LVkw9j`IPg4kI z5e`M1@*jQG;rg)vXnIEge?2@nZ8(S&Bi2lBDTkEf9)#gAoOXuYz(aLd@Jw<_$~+Z_ zbdsUUd0qioCR`kt22{SJB1cEz-in9HhN*1PTI#7mAne@9w%T?SYtHuYN8^bfPUyzJ z>UDi?i-4NvX|GMA$~zu_s5VFuQIg)Nbz+z!=8_hfc$1w!)hILo3y+Xn9|EmWFEBu5l>Y zc6R7=<6Hwg8-v`tS(4p7fM(nBSy~JyS%NnAKVku@(C+2HE4)ErCNcLk8DY+SX;{?o z9(C_-RXYtI|BnK;MN=^7zQqzETE~a|H}ux&cc)jqK``~huVc^s*9Q9M3BbbXEL8r0 z(9n!=fiSfwX-l*%eA)yJZ(sqwE?~yxd0e8GrhKVz+RLZRsmG{u)c8z*Rsfi2r4%zF z-wBwGx56x2X}sd3sZV3>C>&k}oe4(EpxX<*4Fl^}_wb;1PPmI~h;Dbg>v*1Hk%E@k zMcDK_g{o{)uLai$Uo*>(|>(Wh`V11U}*yVqsWYd zi7k1}W5^h=x23dQHa$Er$PfL|C9sf*EYKJBY*4Zi)Ui&GI8z(XV+h+X6ZOeF_9Mn zlcRgPb;Kp-xNGcKuF@*$=kY3)BSUhiRnrA(W_guzV4@aPySLH3!=y+DSWM3pSHVqi zMV}2J*ydIjok^N$cnqAz5c0WB=v!nocDdVUjQ~rXHDccz^f0d2DW@^%ZD*LDG3r73 zd$V5s`MqI}_q;Rh)t^xdcHF}XM^g93LYV*L)Z;86Tn0GivT5#y+xfuUD6pxHXJeb4 q!}vC!#j=vd&PfpVdjo$GOo5BWUd*t#8NAAxUOYK_wf+|^3?OIy7!jTT literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ee/526f868bf8049c3a3c2925cca7caf53f753ce1 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ee/526f868bf8049c3a3c2925cca7caf53f753ce1 new file mode 100644 index 0000000000000000000000000000000000000000..985a98f216d1437da64ebfe1738c8f57d30fcfde GIT binary patch literal 67 zcmV-J0KETr0V^p=O;s>8U@$Z=Ff%bxNGvGG$xKcx$;{8wD=5k@NG&SKOf6=3IQ>xK Z!DXsvwB_d7T~}b9EATw95dcgK77IQs8fO3i literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ee/fc7c1cd3104f04700883c72f6a26624fe39535 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ee/fc7c1cd3104f04700883c72f6a26624fe39535 new file mode 100644 index 0000000000000000000000000000000000000000..269a952b3e931bfe81e1fe91c5d3fe3f9663eedd GIT binary patch literal 76 zcmV-S0JHyi0V^p=O;s?pWH2-^Ff%bxaLUgwDK05WEO5@rOwB8CEGWpyOinDx%+J%y iN-Rrcu%4x!{3Ppu`?0vfTW{{3?-z2a(FFh!x*9f>&>`di literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ef/06402dcf0b6725c7ec095edc45f28850bbeca7 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ef/06402dcf0b6725c7ec095edc45f28850bbeca7 new file mode 100644 index 0000000000000000000000000000000000000000..db0a1cb35f23cb73d090bdc040ccfc14f6fdf08d GIT binary patch literal 79 zcmV-V0I>gf0V^p=O;s>6XD~4U0)?!^vP6bGnuhV#dUB^uoGdcc*}2L$Lcg00B3+bP loL^d$oLbDFUp8~He&M$l>^C-Dc(6iGyRW-;5dgGI9G)uPBHRD~ literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ef/4b55a95adc4146da78d43b7db4600bfa947e4e b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ef/4b55a95adc4146da78d43b7db4600bfa947e4e new file mode 100644 index 00000000..4c084c40 --- /dev/null +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ef/4b55a95adc4146da78d43b7db4600bfa947e4e @@ -0,0 +1,2 @@ +xmSËnÛ0ìÕüŠ…OIàÐyôÒæbÅvQ¡ XNƒ)i%o#“*IE6‚ü{—²ÚÆMuÄåÎpf–J+“ÂåÅõÕ‡ñ™€3˜šzo©Üx¸º¸¼>ç×'ðÃEÒªÕø±¼î¿œdX@ÞQ†ÚaÎÑv ¨Vcû|GëÈh¸’pX‡ýÖðô&PìM[µm<4™ƒT!à.ÃÚiÈ̶®Hé ¡%¿éÎéY‚xì9Lê·+Ô{0ÅÛFP¾ áÙx_»ÏãqÛ¶Ru’¥±å¸:rã»x:_$ós–ÝÃîu…ÎÅŸ Y¶œîAÕ,+S)‹­TÛåSZä=o‚ìÖ’']ŽÀ™Â·ÊbК“ó–ÒÆ¥Ö»öþ¶sS†Qq2„Û(‰“Q yˆ×_—÷kxˆV«h±Žç ,W0].fñ:^.xõ¢Å#|‹³ gÆÓÁ]mƒ#…<1ïÂK0„þgbPð~X»3*(ckºlT‰Pšg´šAvK.ÌÕ±À6XD~4U0)?!^vP1^Mzw2&nzrAYr0}+*z3-XWqY*>EeCq%j^ mwK%`DC^@y5q3xQKS-pK} z=K5puYVzs{zR2NavC96{^DY&_~tFM>%Wjcnthl2rvzOSwNyaLOwo$1gt|-fQZz-XX(dZW zaPWj6stlje+(4X3!XSGQRmaDZi1V>SjqwPrc>}Q-JZOy+34i4Z8 zMBdRk)Rx^+Meycm5!6ubpOoSJA+BILS6o{9v-hkLC@5ei6q-0H&^yZj!Lh5oQc?xT zfaAycn+gH2H@x)`XMGY-kupprKJN}w8>)^|P;dJ7=KSJ)GWqi6YV!H(b3Q!By zzTiw-?3Tjd>dud|;Uuy}2V{se5z7EXv$<=R4+sm|I6yqMPP3LQlcFNnJ=xj^MCSsm zyplpem;A}0f_BHSZ2LFGIJP>&7DZMV3Ub15c!I)CNv91jVUR?la`vI!J(*iQz`Wl( z{XSM?x+#-KiidAI`39+gT#Z2F9=Lx<9lX z2ZiZ7E)h^tiZyy}7F;9vyKS^V6d4BpVCgg^d*QWasgJtuwwY}=L?=FTPrv;}X_Q-* z{$@Z8_hv>lu$$bYZ5~K@-xo-B^}E0pOIv;z&c5}xH@@4Iw=B8=_9z}GKfXRZTPg`| z35Lf`Q9(MLVePAatk9mxiYboU-K`qW(k|7J*4@3Ex(+Bqv%FEzYcv5JnRW zMms+KV>UjTO8`*;@?DMWqehi0T_uutw_!~|!Gh>Vo;Kcv{ literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f1/6d1cc196227c95775c760b8f5001ae0b81859d b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f1/6d1cc196227c95775c760b8f5001ae0b81859d new file mode 100644 index 0000000000000000000000000000000000000000..4c28f21dcc30a916e355e56894d0ca6348f5c504 GIT binary patch literal 47 zcmV+~0MP$<0V^p=O;s>9WH2!R0)>>++9-V$&0;N?$az9%o=Ch*t_0stes F5TL`>6fyt+ literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f1/8b83bb602bb431e656d8b05f6c7f14b072cc8e b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f1/8b83bb602bb431e656d8b05f6c7f14b072cc8e new file mode 100644 index 0000000000000000000000000000000000000000..346b329d723c267f2be6e02782aff178a5fe995f GIT binary patch literal 85 zcmV-b0IL6Z0V^p=O;s>AVlXr?Ff%bxa7)ch&vQ*oPc8DyD=taQE6GeO$;{7lEGWpy rOa?PUQj1H9^|BJn5*c7Fk&z?FfcPQQ3!H%bn$i7%S~ah+O75AT=I=Cd}=G2Hm`as zl9y&`0990wpQ~4qo5R4P&k@>d^S~>cZCltQk5KlR`8j?j20)-tT$IcZe?Z~>dJT*B Vk_zA4zVEeY+*W(G1OOj#D2a0UHOBw| literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f1/c2ed073c7743972716b617c94b7ea3453186ed b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f1/c2ed073c7743972716b617c94b7ea3453186ed new file mode 100644 index 0000000000000000000000000000000000000000..233d732a14a0022f1b66fdee17fa2f8ef5bcf9f9 GIT binary patch literal 928 zcmV;R17G}j0nJw3PunmM-)s9#I-E!RR;{5+V5wOEm)RN*&&-{Aje$S{!1$TrT6~e$3?@zaEeG@Q?GeNxEPqjq*xq zTBU5{tXhkb-mxmCf`Xd0ySzBZZ{jid9u5Ww9zRs}g)^Q~ZR2Wu?Y2ZlLqRw_m3x&r zVPsvza2_SY0V#RLiti41Vy_79$cCUam%J9ISpw){B_xnCleA<@E^p(s;B^)&T8e@Z z>@~rNN}bPWs=?0LL{>F&s?oGo1P3}`(eR(V_!Sz&jrcdgUIBE0wp%)fNRk^W30@yf zycGnu+o`<;t&FKu=E6{$oUoE3pWPXkXkuZa4+b5*few)YC%IsdJf+_<-P!#Heh`dGc8@RxR^%(L=pe-69FXhqDda0V!%I7z+wO+JljU zYhX#;<^p9*6nuqV>P4;){N2<_BZ@SGf6x?l!CpDOj8Ra#w%a0S9l4h`a|i}0uV(qY zmbRIlXFv^p6D@1#9sB75!hKyJc^z^$eBX52+Ot=J-N+jjZ4o*YJHij$`)@-f!41Li z2?VezgSqKTrxmO$+`rF}PP23<4%6MXi(_e%YSXSwAlC0XuKyGUjIxN9KgB-{q@TF3 z;=;W7;bF>jGXyBG6uLQackbIXTbH8XXj2#Fa&=BCI%lPycP+O~l7qB6dLJH%b_aCR zygSdKuO71XSbW63Fb%6$K!o5W!S>5_nxiBy1(!fxOVB1m;n@KXIO|XZ+_lry_dzRY z3NUY1qN=D+3$9@og3yHIme<6spUL{V*;=4b%Odf6-n`tbd CP{ULJ literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f1/e390ce2d14d5f51c990d48c2801dbc27cd5964 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f1/e390ce2d14d5f51c990d48c2801dbc27cd5964 new file mode 100644 index 0000000000000000000000000000000000000000..649736d08c13a64cd818197132785c65b52078c4 GIT binary patch literal 1003 zcmV^6%yDSD+P+UA-P36ff` zTlBwoNQyFTX;Y_2fE3U{BxiR<_cWJ!ji1ct7x<5x>qWU? zHO+WqENx0Q3tqiPP48KgQ$@kd``y02!QbX{*n2veAP9bGe1vORQtQvv?e(}Paux=T zGcb8DRhZ2D7CDS(#dJbySuyc@0ABbdf{*5=V6@hv>kO4KOsDSI-5&l9c!GppHPA#0r9lfV9`^826jNqdgAJpe4 zh^sgKMKjjyc)1zyG^VS7Jpt@>p;%Kv6WHI-hOSv1Q(ducp`*r0D4IH|{zVPG2#(|c z4oMND=ga!Yu-B;`z%3TT8P(#BW%r5|O4bDXzi?JlLY@m=E2%-HVdPev+*4S|H~>#3 zjwnjGi|RQJ^?~IwM$b{b?AY>@ob+&Bzn}I5(B@hSh4fL6F`|@5g%VrGXjdKP^3$?m znE@#!n)Z4M(h6(6%ue!@483$fOTOWR79?8e_P!lKd-8)b>TS?{N6XFY$zPgTh&(($ zPPRPW9@?wfa)p3ZA@}HOyWs}Gch?$=C~}Yy+^MZ#--Jf%$}6EK>>Iov+kQey*{t}w z)&4CIfI~-xeG98wxO)9>sA)X3h3?!l7XKZU1a}0(Z+{=evh64Kem}zdtK2kHnT@p2 zm0;56*I%gJg}FE^clRtHZnY@l`@}`=o)S5iSn#FEV$4jygGUhT?1OS*G(VgW*3hM3 zRfju{yeW=B!mWjm5gZT>0M%STnq=ep>=>e(Wc_?deblott*9`N%#Q;K-T{o7#~{7w zSI+{}1v?`zAB=$<^3>feL9B1$10@RbWO|UrKKtWI{A^@7hNJ5#J>~(pUQGW3iT)>m ZpRrs=@Wd|KCoJ4p{WG|j{sS7~%*X9Q_d@^x literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f3/75d3278b7eba08b8f92472df41bea081e169bf b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f3/75d3278b7eba08b8f92472df41bea081e169bf new file mode 100644 index 0000000000000000000000000000000000000000..fc18b8e1989b316db7ecdc6ba79e8ae9580ddaea GIT binary patch literal 46 zcmb7G-fa~FfcPQQE;tD%q_@Cb{(AphrU(0^fA>#edjSB~>n>9ORW)(| literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f5/48df9c84601939ab92a3d8ecda5b26d80dfbf2 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f5/48df9c84601939ab92a3d8ecda5b26d80dfbf2 new file mode 100644 index 0000000000000000000000000000000000000000..503112c8c3acc41a87b4d864d16398c35725bc3c GIT binary patch literal 1045 zcmV+w1nT>E0gY8nbK5o$?N$60J3Nu80;P5?jhoc6td2EF<&LD(lbKu~awVar00tkT zHJSYPE&$4w?8>zc6annV+kKCVd8OuX^7i!fr{1dsUco@sTP>C=3ny=WIekr!U%{>r z6m1I0E8xzql%{q2W*E77&rhO2X|Mz*OVq)sU-N=|+mkN*joJt$;e@?`%tuYzqclJB zA-2lFnr}fW3(g?L5C#^aLcqHMYYRd`q1JUJxGWGFVOJqf8^t4mFKrApx17v5In-NF zi+w}jwgnCTx3ac2?|QwaX&4WXnbON%6$>)GPou$bJRQC!*sa@VS)nnY@tYHxN}g|l z*95EJa{^oOCiG{ik=&_ckoKoA znx=5kpN^(oALM2Y#P_N}-VaHu@L$+*!3*u@up+;HkN16HF4*lt~6+{rEG30Bu zCcZg+!%H?*P8axc&(MRp@SipNGep6Gsw(t-eKyKN%GT|L*2dLd4ZCC)PE?fpS?7Rp zkK#+Atw1w~%>BRXj^ZG`w=HR;G7{T^$c)!du_w~LF-SOh_?u}*O-;^QZDvs|F$OCt zGRl+lLkT74hd7hk&1s52u!d5`V z1ouQS$>N#YfJcw+iVw)Ez$0P<~b8) z_|5TZrgk_E&pq@bL9URK*r{`Qm^*ZdnUABuMDB~&cy`hpCy8q5bPkx3*ub;FLWc?dI+Q~9ewybo%wui|JBt%?r`YSGG)FZ- z9rZ#CXK}}iaG&a!=`r8OGwrB9;Bb#Z`tY;#Mk{|C#@z29g`ane?(XHD&@BC$TH^6* PN_9uxekA__R{dE>Zixy9 literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f7/53c69ee579383159cc8b323a7e8be9fc6f3ef7 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f7/53c69ee579383159cc8b323a7e8be9fc6f3ef7 new file mode 100644 index 0000000000000000000000000000000000000000..e308a9efba3ff60dc94a6388d331f3c1a2bfc803 GIT binary patch literal 75 zcmV-R0JQ&j0V^p=O;s>6VlXiP0)^bf%shrm$`d_LO;lKN{o0$*WkLIk7W{Pj1CcIC hEiPd&bv94An)BXeYtDy*iL2k{y>d8p69CCkA1{JJAg=%b literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f8/0a139414fc819b4f0795715b5f0387718da198 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f8/0a139414fc819b4f0795715b5f0387718da198 new file mode 100644 index 0000000000000000000000000000000000000000..960d71b6d0e1544e47c98702a20f563c62107583 GIT binary patch literal 81 zcmV-X0IvUd0V^p=O;s>6WiT`_Ff%bxD9F#%tH{k^m^}AT>WV!oAGfUOkQZ3BMnUY- nj5{U6XD~4U0)?!^vP6bh?jseltT*{>_AOqpNv@?}!OvB{Aksyt m#rdU0$*IK*r*(Dy?o(I0F8_;pX2z{~^Y-(-J_rE#YaV{5w9WH2!R0)?!^vP6dK{|!QWqpuyXmp{#BkYfKkeB<9k00Zm~ Eh?fKtX8-^I literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f9/4b262775cf4677ce6c570c372bb41f849e493f b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/f9/4b262775cf4677ce6c570c372bb41f849e493f new file mode 100644 index 0000000000000000000000000000000000000000..90bc2af885d86857260bc324e3c139cc93e11bb3 GIT binary patch literal 46 zcmV+}0MY+=0V^p=O;s>9WH2!R0)>>++yZ__{!y**-LX0R5sQvD$zjqQKHm0Ga z+>kb&8pps;jtW&V@jB<)lhTx%WnC$$bEcK@i&jsE5-g!l9frxg#P1RU^@dEb`y)x; z8BO6?cwf6$!{KVR60$W}7+VgjtwU~jkxb5~>G^Y*-HBc6ik&0NUmIoNa<(B^!>n9p zFt(DbmY>ox?z{q0ZZBJf|I_V%y8Y91Ls@?bd7ByIQFO9Ci6Ugau^u&03Re|JpT&hK zOSUIZUA&dKH+J(tvbLy#!pbGDjQt{l0)ZxJa-$1XHkJieb5y_4V)An(tC{`~sz#Tm zEcJbr4-g^lc@0pFzSvfk_^XU%Z#P0g(1ylothfv($=$(eqbl_2KWcsgWrmX9R`(7b zSQ+lOgWyd!BF^M3Q@UZhZJNWVZZfn;$}5S^)7k?*T8>&Y`W8h!_rg{&ryWxJfe@9ll=_wu|2`=6a` zde*X*bqRCPAHl3kL&{WA46Y%=Ixl=WA0W|4Xk!|j_#*KbFlzmbWUue-^|=6>>LV&# Ci7pBN literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/fa/d8c5b441d583380d1277747b0be1b1b489288f b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/fa/d8c5b441d583380d1277747b0be1b1b489288f new file mode 100644 index 0000000000000000000000000000000000000000..4e2beef1c9c54410cb8040b315c432e019f1d9af GIT binary patch literal 80 zcmV-W0I&ae0V^p=O;s>6XD~4U0)?!^vP6cM3!4?rH&1OnxL;#-+uEf;x0x(AL!^sR mi}Op1l2eNrUd-A0?#ho{_jZeYzT8%pvcgWFJq-X`Cm`uM?j&0P literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/fb/2dd5c25870077a668f75ad074d53948d4edb7b b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/fb/2dd5c25870077a668f75ad074d53948d4edb7b new file mode 100644 index 0000000000000000000000000000000000000000..45cc51d997d668f02b53254e4d242767e7f47b76 GIT binary patch literal 75 zcmV-R0JQ&j0V^p=O;s>6VlXiP0)^bf%sd96`Fl>}&*~3}yKgn)y8NOgJHKwvhDevB h7MC#O&p!86a;DtxOAFurP~Nuj$*Y7G-oh0FfcPQQShyFNli;E%_#}WOiIenbI#98%S_kHN-Rrc z@Q6Ms)EKHQUZETiQeGL`^jCQCMW`-_VyI4t9>;=$oXq6JlFa-(h<1g|s&|erUHLjp U;E!ng{!=Fn?LQs_0Jp6$KCsd=IRF3v literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/fc/9818265d74243f19bcf23e33c3ffe0e1d4d9a0 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/fc/9818265d74243f19bcf23e33c3ffe0e1d4d9a0 new file mode 100644 index 0000000000000000000000000000000000000000..c4526dab46d3270ec00b2f2d2ee67f736e450a7e GIT binary patch literal 74 zcmV-Q0JZ;k0V^p=O;s>8XD~D{Ff%bx2q`T}%FIg*E-6Y)%yld%$jMAjEXmBz)5}UM gOJtZD`TEFfw%<3_>NIJ})%ZSqeb`wD0PMXP#qmZUB>(^b literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/fd/3a786e51356914336bdc7e749c8df85b6aa9a9 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/fd/3a786e51356914336bdc7e749c8df85b6aa9a9 new file mode 100644 index 0000000000000000000000000000000000000000..ff217524c511f3dd4631fb0eddfd5f8a4f9d19cf GIT binary patch literal 726 zcmV;{0xA7?0i9G$PuoBc?KS=t)0_edYoP6crm7N>w6zLJ6$cQidRW^NXN9xt?yfOb z#eeUtZ6Nf6R^*UmJu`3Lyf@=0QxP1zeslD~-}PV@#wxG0NY@q)_YYp}(bo~!HG-mt zLh=lFVb@C2x&3DtmAT3j5u-GiKp_*|DKn*0KWiE?{z)*N&cf*)(QeDmWQN9o#_xsD)N)h-&xuyd zBO;seveqZnNHMD%?NSRXWZDO#R<`6C9oIw{t3_1UN2;~m0QJ6|K)P`W-BAcZ*oEU! z7=(QXauF;)&Cix_Fw8xR_>*i3D>8OkWLBK>tiV&AKbc-) z#3CUR#w9I6EhAgdq@l4?nv*uqE&swv)MpeMJ66(am1U^OD}T3M_+k4hnDA?autH7N z``)l|>KCEC;U8u5h70QI0o==rh_(pgjMH#V$+s)s2)tz){P4U^n`oRqF(uN}YNzwt=rCQ#-e17UZ@RkQln=blE!{;Vx7F`;{Zy%>yK~Q?xs-N7 zCB3`kT5EXZ`nx8t56$m;$ekZ|EGuJi!%%DHM%`wz*M^BjN24t?ZU4vleDbo}@VfPW I0{jI3QrAsyQvd(} literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/fd/55da4d92c192a101fa78f4fa213b6193b4d047 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/fd/55da4d92c192a101fa78f4fa213b6193b4d047 new file mode 100644 index 0000000000000000000000000000000000000000..a66c9f160e7cdc233869231bf3579d09b292d56f GIT binary patch literal 80 zcmV-W0I&ae0V^p=O;s>6XD~4U0)?!^vP1@vNuMXanwCGE&*f_1vi|1Aw|R+ceLf+8uqM+0 literal 0 HcmV?d00001 diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ff/647c81423cd27792ff93f0db2d68c38f28bbf1 b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ff/647c81423cd27792ff93f0db2d68c38f28bbf1 new file mode 100644 index 00000000..e4e3fa05 --- /dev/null +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ff/647c81423cd27792ff93f0db2d68c38f28bbf1 @@ -0,0 +1,2 @@ +xíUQOÛ0Þkó+N}*¨8lcÓF5‰¶­k%R†Ð´ǽ¦©ÙNC5ñßwv²‘ /{$Q|çûüÝÝçKšëÞ¾?zïG°c]ìŒÌÖŽŒ¯èõÜA“Q*ž/ÝZZ7_–Q˜<—•Å%”j‰& .(¶ñôá+µ‚7ìzµÛ¸º{±Ó%lø”vPZ$ ia%s¼X8 +„Þ¹äJ TÒ­Ã9 Šg× †N§íœŠèU{#p×ÿ¬+ìqWUÅx Ì´Éâ¼NÈÆçÓñd–Lˆvv©r´ þ,¥¡”Óð‚h žÙœW¡>™Aò9íiWF:©²>X½r7è¹.¥uF¦¥û§jM6@¹·7Pݸ‚î0iÒ…Ñ0™&}r5]|ž_.àjxq1œ-¦“æ0žÏN§‹é|F«3ήáËtvÚ¤šQwð¶0>j£ôõÄe(^‚¾è;+òûµ-PÈ•”šÊJž!dz‹FQFP ÙHëûj‰àÒSÊåF:î‚é^ ­.ÅQôˆÜÞz¹} ¾ÈíEnÿUnt­o¼néšÚA‘èµq$ÿŒÙÂŒW†o°Ò憥Z;6âJ¡a_õÏn¦‘¨…V+™•YðF„2¬G‚¿σ¤¥Ìin6á­ÐQíxAäº\²š³hèn²‰òÃhx%Áô4„Vo«Jãƒ[,ÈìÝTºx?Œû“æGpÊ·ÉM=ãèäÑD'ùDE™ÒÌ‘sEm¦ð+Š:×úI"`«å’~Rõš™*ûþ¸Éìmíthq½°D»ÁO'uxËkt¥Q °‚:­VIšÆôÚÄYÈe¥A?^>=ÿbó³³=âÙé°ÂhÿG³½®¢¼¶Ø½·Ó$uÒ{šz‰~ú@O·b;n-V:åa¿k8ê>7b}®E˜¿Çþ¬c[#b‡ÖÅ4õuiÚXeÄÎ7¥jð.ú …Ø»- \ No newline at end of file diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ff/c3a7458f4477ab312f9b8ba9e2152d281c9a0d b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/git/objects/ff/c3a7458f4477ab312f9b8ba9e2152d281c9a0d new file mode 100644 index 0000000000000000000000000000000000000000..2d0e4bf4a8b726dd96f77f602e5da715349c38f4 GIT binary patch literal 977 zcmV;?11|h{0nJuTkJ~m7&DH)DjFCfoptv771PiW$v}uz7yUn6bie71nwz(^j0!giH z6#efVlA@N9?bNv>0dx?lH^X^vKBz^d7U=Tw<;64ldRtfMk!vHAyq=wBXEVfQp-LfF z*R#)`e#ft7uk$Hww7TboMSzy(YHP&xY;A3GMaX8e$u^gn(kpUtc6LtwzP*_jYhE)f zq_IpEd={*Fi<&)hnX!fe%-h|4yd^KQGdO!XnILd}WxR(QRWR%0>drcDi5$W}ID3$- zDZ?iAM`W;`<Xw)s%zz%Db522qxp)qJD$LsnF(Ei=RF zrs9-DBp5Mm#gY{k?1ByUP#mCm$;C?I_0Cu=wv;4juDTx5Uf`AWf z1u^CKOjGi-bdgI4^OWN~4)7&6g%*vIJAcb-g<{5+N~5`_j(&BFDM_L3sD^1SEok~> zy%tK@RHs8iIShuX(Uxl*{EifQlIS9XYR!K6{Nd&;p8xUYZvOt`r&ON_)x3iGdE|G@ zu1SvQbBs}?)I-~#;2SNqs*&c6GQujoLm0c#04W0_uS>&a2`#a^WsepXZ!ddVpE1i4%&(#c6j9&l^=!;@@2C6KV_=#CNx3I!Wo1gexvwy1d7 zk&P=4?ah5{P%;eriPj#AT2zo5CEYD{h{kR5{Ujc}!xM-sS!Ez?r!z^2g#^)1g@4BX zg_yR{_8#r1_7T?KH+hGG9~0eU)a!nP(sxhf0amdKhv}P6VL$wI \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then + while [ -h "$PRG" ]; do + ls=$(ls -ld "$PRG") + link=$(expr "$ls" : '.*-> \(.*\)$') + if expr "$link" : '/.*' >/dev/null; then PRG="$link" else - PRG="`dirname "$PRG"`/$link" + PRG="$(dirname "$PRG")/$link" fi done - saveddir=`pwd` + saveddir=$(pwd) - M2_HOME=`dirname "$PRG"`/.. + M2_HOME=$(dirname "$PRG")/.. # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` + M2_HOME=$(cd "$M2_HOME" && pwd) cd "$saveddir" # echo Using m2 at $M2_HOME fi # For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then +if $cygwin; then [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` + M2_HOME=$(cygpath --unix "$M2_HOME") [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + JAVA_HOME=$(cygpath --unix "$JAVA_HOME") [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` + CLASSPATH=$(cygpath --path --unix "$CLASSPATH") fi # For Migwn, ensure paths are in UNIX format before anything is touched -if $mingw ; then +if $mingw; then [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" + M2_HOME="$( ( + cd "$M2_HOME" + pwd + ))" [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + JAVA_HOME="$( ( + cd "$JAVA_HOME" + pwd + ))" # TODO classpath? fi if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + javaExecutable="$(which javac)" + if [ -n "$javaExecutable" ] && ! [ "$(expr \"$javaExecutable\" : '\([^ ]*\)')" = "no" ]; then # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + readLink=$(which readlink) + if [ ! $(expr "$readLink" : '\([^ ]*\)') = "no" ]; then + if $darwin; then + javaHome="$(dirname \"$javaExecutable\")" + javaExecutable="$(cd \"$javaHome\" && pwd -P)/javac" else - javaExecutable="`readlink -f \"$javaExecutable\"`" + javaExecutable="$(readlink -f \"$javaExecutable\")" fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` + javaHome="$(dirname \"$javaExecutable\")" + javaHome=$(expr "$javaHome" : '\(.*\)/bin') JAVA_HOME="$javaHome" export JAVA_HOME fi fi fi -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then +if [ -z "$JAVACMD" ]; then + if [ -n "$JAVA_HOME" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then # IBM's JDK on AIX uses strange locations for the executables JAVACMD="$JAVA_HOME/jre/sh/java" else JAVACMD="$JAVA_HOME/bin/java" fi else - JAVACMD="`which java`" + JAVACMD="$(which java)" fi fi -if [ ! -x "$JAVACMD" ] ; then +if [ ! -x "$JAVACMD" ]; then echo "Error: JAVA_HOME is not defined correctly." >&2 echo " We cannot execute $JAVACMD" >&2 exit 1 fi -if [ -z "$JAVA_HOME" ] ; then +if [ -z "$JAVA_HOME" ]; then echo "Warning: JAVA_HOME environment variable is not set." fi @@ -187,11 +194,11 @@ CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher # For Cygwin, switch paths to Windows format before running java if $cygwin; then [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` + M2_HOME=$(cygpath --path --windows "$M2_HOME") [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + CLASSPATH=$(cygpath --path --windows "$CLASSPATH") fi # traverses directory structure from process work directory to filesystem root @@ -199,12 +206,15 @@ fi find_maven_basedir() { local basedir=$(pwd) local wdir=$(pwd) - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then + while [ "$wdir" != '/' ]; do + if [ -d "$wdir"/.mvn ]; then basedir=$wdir break fi - wdir=$(cd "$wdir/.."; pwd) + wdir=$( + cd "$wdir/.." + pwd + ) done echo "${basedir}" } @@ -212,7 +222,7 @@ find_maven_basedir() { # concatenates all lines of a file concat_lines() { if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" + echo "$(tr -s '\n' ' ' <"$1")" fi } @@ -227,15 +237,15 @@ export MAVEN_CMD_LINE_ARGS WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain echo "Running version check" -VERSION=$( sed '\!//' -e 's!.*$!!' ) +VERSION=$(sed '\!//' -e 's!.*$!!') echo "The found version is [${VERSION}]" if echo $VERSION | egrep -q 'M|RC'; then - echo Activating \"milestone\" profile for version=\"$VERSION\" - echo $MAVEN_ARGS | grep -q milestone || MAVEN_ARGS="$MAVEN_ARGS -Pmilestone" + echo Activating \"milestone\" profile for version=\"$VERSION\" + echo $MAVEN_ARGS | grep -q milestone || MAVEN_ARGS="$MAVEN_ARGS -Pmilestone" else - echo Deactivating \"milestone\" profile for version=\"$VERSION\" - echo $MAVEN_ARGS | grep -q milestone && MAVEN_ARGS=$(echo $MAVEN_ARGS | sed -e 's/-Pmilestone//') + echo Deactivating \"milestone\" profile for version=\"$VERSION\" + echo $MAVEN_ARGS | grep -q milestone && MAVEN_ARGS=$(echo $MAVEN_ARGS | sed -e 's/-Pmilestone//') fi exec "$JAVACMD" \ diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/oauth2-zuul/src/test/java/demo/ZuulApplicationTests.java b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/oauth2-zuul/src/test/java/demo/ZuulApplicationTests.java index 8074285c..5cc75497 100644 --- a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/oauth2-zuul/src/test/java/demo/ZuulApplicationTests.java +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/oauth2-zuul/src/test/java/demo/ZuulApplicationTests.java @@ -36,6 +36,7 @@ public class ZuulApplicationTests { @Value("${local.server.port}") int port; + private TestRestTemplate restTemplate = new TestRestTemplate(); @Test diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/scripts/runTests.sh b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/scripts/runTests.sh index ca283221..cfd4a74b 100755 --- a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/scripts/runTests.sh +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/scripts/runTests.sh @@ -6,7 +6,7 @@ REPO_URL="${REPO_URL:-https://github.com/spring-cloud-samples/tests.git}" REPO_BRANCH="${REPO_BRANCH:-master}" if [[ -d zuul-config-discovery ]]; then REPO_LOCAL="${REPO_LOCAL:-.}" -else +else REPO_LOCAL="${REPO_LOCAL:-tests}" fi WAIT_TIME="${WAIT_TIME:-5}" @@ -15,31 +15,31 @@ DEFAULT_VERSION="${DEFAULT_VERSION:-1.0.0.BUILD-SNAPSHOT}" # Parse the script arguments while getopts ":r" opt; do - case $opt in - r) - RESET=0 - ;; - \?) - echo "Invalid option: -$OPTARG" >&2 - exit 1 - ;; - :) - echo "Option -$OPTARG requires an argument." >&2 - exit 1 - ;; - esac + case $opt in + r) + RESET=0 + ;; + \?) + echo "Invalid option: -$OPTARG" >&2 + exit 1 + ;; + :) + echo "Option -$OPTARG requires an argument." >&2 + exit 1 + ;; + esac done # Clone or update the repository if [[ ! -e "${REPO_LOCAL}/.git" ]]; then - git clone "${REPO_URL}" "${REPO_LOCAL}" - cd "${REPO_LOCAL}" + git clone "${REPO_URL}" "${REPO_LOCAL}" + cd "${REPO_LOCAL}" else - cd "${REPO_LOCAL}" - if [[ $RESET ]]; then - git reset --hard - git pull "${REPO_URL}" "${REPO_BRANCH}" - fi + cd "${REPO_LOCAL}" + if [[ $RESET ]]; then + git reset --hard + git pull "${REPO_URL}" "${REPO_BRANCH}" + fi fi ./mvnw --fail-at-end clean package diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/test.sh b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/test.sh new file mode 100755 index 00000000..6c98ed33 --- /dev/null +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-core-tests/test.sh @@ -0,0 +1 @@ +touch generate.log diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-release/README.adoc b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-release/README.adoc index 1a3aca67..55acd58a 100644 --- a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-release/README.adoc +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-release/README.adoc @@ -1,63 +1,55 @@ // Do not edit this file (e.g. go instead to src/main/asciidoc) -Spring Cloud Release Train is a curated set of dependencies across a -range of Spring Cloud projects. You consume it by using the -spring-cloud-dependencies POM to manage dependencies in Maven or -Gradle. The release trains have names, not versions, to avoid -confusion with the sub-projects. The names are an alphabetic sequence -(so you can sort them chronologically) with names of London Tube -stations ("Angel" is the first release, "Brixton" is the second). +Spring Cloud Release Train is a curated set of dependencies across a range of Spring Cloud projects. +You consume it by using the spring-cloud-dependencies POM to manage dependencies in Maven or Gradle. +The release trains have names, not versions, to avoid confusion with the sub-projects. +The names are an alphabetic sequence (so you can sort them chronologically) with names of London Tube stations ("Angel" is the first release, "Brixton" is the second). == Contributing -Spring Cloud is released under the non-restrictive Apache 2.0 license, -and follows a very standard Github development process, using Github -tracker for issues and merging pull requests into master. If you want -to contribute even something trivial please do not hesitate, but -follow the guidelines below. +Spring Cloud is released under the non-restrictive Apache 2.0 license, and follows a very standard Github development process, using Github tracker for issues and merging pull requests into master. +If you want to contribute even something trivial please do not hesitate, but follow the guidelines below. === Sign the Contributor License Agreement + Before we accept a non-trivial patch or pull request we will need you to sign the https://cla.pivotal.io/sign/spring[Contributor License Agreement]. -Signing the contributor's agreement does not grant anyone commit rights to the main -repository, but it does mean that we can accept your contributions, and you will get an -author credit if we do. Active contributors might be asked to join the core team, and -given the ability to merge pull requests. +Signing the contributor's agreement does not grant anyone commit rights to the main repository, but it does mean that we can accept your contributions, and you will get an author credit if we do. +Active contributors might be asked to join the core team, and given the ability to merge pull requests. === Code of Conduct + This project adheres to the Contributor Covenant https://github.com/spring-cloud/spring-cloud-build/blob/master/docs/src/main/asciidoc/code-of-conduct.adoc[code of -conduct]. By participating, you are expected to uphold this code. Please report -unacceptable behavior to spring-code-of-conduct@pivotal.io. +conduct]. +By participating, you are expected to uphold this code. +Please report unacceptable behavior to spring-code-of-conduct@pivotal.io. === Code Conventions and Housekeeping -None of these is essential for a pull request, but they will all help. They can also be -added after the original pull request but before a merge. -* Use the Spring Framework code format conventions. If you use Eclipse - you can import formatter settings using the +None of these is essential for a pull request, but they will all help. +They can also be added after the original pull request but before a merge. + +* Use the Spring Framework code format conventions. +If you use Eclipse you can import formatter settings using the `eclipse-code-formatter.xml` file from the https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-dependencies-parent/eclipse-code-formatter.xml[Spring - Cloud Build] project. If using IntelliJ, you can use the + Cloud Build] project. +If using IntelliJ, you can use the https://plugins.jetbrains.com/plugin/6546[Eclipse Code Formatter Plugin] to import the same file. * Make sure all new `.java` files to have a simple Javadoc class comment with at least an - `@author` tag identifying you, and preferably at least a paragraph on what the class is - for. -* Add the ASF license header comment to all new `.java` files (copy from existing files - in the project) -* Add yourself as an `@author` to the .java files that you modify substantially (more - than cosmetic changes). + `@author` tag identifying you, and preferably at least a paragraph on what the class is for. +* Add the ASF license header comment to all new `.java` files (copy from existing files in the project) +* Add yourself as an `@author` to the .java files that you modify substantially (more than cosmetic changes). * Add some Javadocs and, if you change the namespace, some XSD doc elements. * A few unit tests would help a lot as well -- someone has to do it. -* If no-one else is using your branch, please rebase it against the current master (or - other target branch in the main project). -* When writing a commit message please follow https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html[these conventions], - if you are fixing an existing issue please add `Fixes gh-XXXX` at the end of the commit - message (where XXXX is the issue number). +* If no-one else is using your branch, please rebase it against the current master (or other target branch in the main project). +* When writing a commit message please follow https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html[these conventions], if you are fixing an existing issue please add `Fixes gh-XXXX` at the end of the commit message (where XXXX is the issue number). == Building and Deploying -Since there is no code to compile in the starters they should do not need to compile, but a compiler has to be available because they are built and deployed as JAR artifacts. To install locally: +Since there is no code to compile in the starters they should do not need to compile, but a compiler has to be available because they are built and deployed as JAR artifacts. +To install locally: ---- diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-release/docs/src/main/asciidoc/README.adoc b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-release/docs/src/main/asciidoc/README.adoc index 454dda11..114be509 100644 --- a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-release/docs/src/main/asciidoc/README.adoc +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-release/docs/src/main/asciidoc/README.adoc @@ -6,7 +6,8 @@ include::https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/maste == Building and Deploying -Since there is no code to compile in the starters they should do not need to compile, but a compiler has to be available because they are built and deployed as JAR artifacts. To install locally: +Since there is no code to compile in the starters they should do not need to compile, but a compiler has to be available because they are built and deployed as JAR artifacts. +To install locally: ---- diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-release/docs/src/main/asciidoc/intro.adoc b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-release/docs/src/main/asciidoc/intro.adoc index 5ae66a35..eb7c9f8d 100644 --- a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-release/docs/src/main/asciidoc/intro.adoc +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-release/docs/src/main/asciidoc/intro.adoc @@ -1,7 +1,4 @@ -Spring Cloud Release Train is a curated set of dependencies across a -range of Spring Cloud projects. You consume it by using the -spring-cloud-dependencies POM to manage dependencies in Maven or -Gradle. The release trains have names, not versions, to avoid -confusion with the sub-projects. The names are an alphabetic sequence -(so you can sort them chronologically) with names of London Tube -stations ("Angel" is the first release, "Brixton" is the second). \ No newline at end of file +Spring Cloud Release Train is a curated set of dependencies across a range of Spring Cloud projects. +You consume it by using the spring-cloud-dependencies POM to manage dependencies in Maven or Gradle. +The release trains have names, not versions, to avoid confusion with the sub-projects. +The names are an alphabetic sequence (so you can sort them chronologically) with names of London Tube stations ("Angel" is the first release, "Brixton" is the second). \ No newline at end of file diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-release/docs/src/main/asciidoc/spring-cloud-starters.adoc b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-release/docs/src/main/asciidoc/spring-cloud-starters.adoc index 4d473a4a..2bebbf91 100644 --- a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-release/docs/src/main/asciidoc/spring-cloud-starters.adoc +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-release/docs/src/main/asciidoc/spring-cloud-starters.adoc @@ -11,7 +11,8 @@ include::intro.adoc[] == Using Spring Cloud Dependencies with Spring IO Platform -The Spring IO Platform is a modular, enterprise-grade curated set of dependencies. To use the Spring Cloud Starters with Spring IO Platform, you must import the Spring Cloud Dependencies bill of materials (BOM) first. +The Spring IO Platform is a modular, enterprise-grade curated set of dependencies. +To use the Spring Cloud Starters with Spring IO Platform, you must import the Spring Cloud Dependencies bill of materials (BOM) first. To use version {springioplatformversion} of the Spring IO Platform and Spring Cloud Release Train {springcloudversion} with Maven, update the pom.xml as follows: diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-static/current/index.html b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-static/current/index.html index d499456d..0e3ecb98 100644 --- a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-static/current/index.html +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-static/current/index.html @@ -1,7 +1,7 @@ - + \n" + "\n" + + "Page Redirection\n" + "\n" + + "\n" + + "If you are not redirected automatically, follow the link to latest release\n"; + } + +} diff --git a/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/buildsystem/MavenBomParserAccessor.java b/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/buildsystem/MavenBomParserAccessor.java new file mode 100644 index 00000000..01ba1b3a --- /dev/null +++ b/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/buildsystem/MavenBomParserAccessor.java @@ -0,0 +1,31 @@ +/* + * Copyright 2013-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.release.internal.buildsystem; + +import java.util.Collections; + +import org.springframework.cloud.release.cloud.buildsystem.SpringCloudMavenBomParserAccessor; +import org.springframework.cloud.release.internal.ReleaserProperties; + +public class MavenBomParserAccessor { + + public static BomParser cloudMavenBomParser(ReleaserProperties properties) { + return new MavenBomParser(properties, + Collections.singletonList(SpringCloudMavenBomParserAccessor.cloud())); + } + +} diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/TestPomReader.java b/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/buildsystem/TestPomReader.java similarity index 82% rename from spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/TestPomReader.java rename to spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/buildsystem/TestPomReader.java index d4d09a4d..ce12d9b9 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/TestPomReader.java +++ b/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/buildsystem/TestPomReader.java @@ -14,21 +14,21 @@ * limitations under the License. */ -package org.springframework.cloud.release.internal.pom; +package org.springframework.cloud.release.internal.buildsystem; import java.io.File; import org.apache.maven.model.Model; +import org.springframework.cloud.release.internal.tech.PomReader; + /** * @author Marcin Grzejszczak */ public class TestPomReader { - PomReader pomReader = new PomReader(); - public Model readPom(File pom) { - return this.pomReader.readPom(pom); + return PomReader.readPom(pom); } } diff --git a/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/pom/TestUtils.java b/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/buildsystem/TestUtils.java similarity index 96% rename from spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/pom/TestUtils.java rename to spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/buildsystem/TestUtils.java index a13a6e42..8cfefb1f 100644 --- a/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/pom/TestUtils.java +++ b/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/buildsystem/TestUtils.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.release.internal.pom; +package org.springframework.cloud.release.internal.buildsystem; import java.io.File; import java.io.IOException; diff --git a/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/docs/TestDocumentationUpdater.java b/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/docs/TestDocumentationUpdater.java index 5e7be08c..42c86347 100644 --- a/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/docs/TestDocumentationUpdater.java +++ b/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/docs/TestDocumentationUpdater.java @@ -18,9 +18,11 @@ package org.springframework.cloud.release.internal.docs; import java.io.File; +import edu.emory.mathcs.backport.java.util.Collections; + import org.springframework.cloud.release.internal.ReleaserProperties; import org.springframework.cloud.release.internal.git.ProjectGitHandler; -import org.springframework.cloud.release.internal.pom.Projects; +import org.springframework.cloud.release.internal.project.Projects; import org.springframework.cloud.release.internal.template.TemplateGenerator; /** @@ -29,9 +31,10 @@ import org.springframework.cloud.release.internal.template.TemplateGenerator; public class TestDocumentationUpdater extends DocumentationUpdater { public TestDocumentationUpdater(ReleaserProperties properties, - TestProjectDocumentationUpdater updater, + CustomProjectDocumentationUpdater updater, ProjectGitHandler handler, TestReleaseContentsUpdater testRelease) { - super(properties, updater, testRelease); + super(properties, new ProjectDocumentationUpdater(properties, handler, + Collections.singletonList(updater)), testRelease); } public static class TestReleaseContentsUpdater extends ReleaseTrainContentsUpdater { @@ -48,34 +51,4 @@ public class TestDocumentationUpdater extends DocumentationUpdater { } - public static class TestProjectDocumentationUpdater - extends ProjectDocumentationUpdater { - - private final String version; - - public TestProjectDocumentationUpdater(ReleaserProperties properties, - ProjectGitHandler gitHandler, String version) { - super(properties, gitHandler); - this.version = version; - } - - @Override - String readIndexHtmlContents(File indexHtml) { - return response(); - } - - private String response() { - return "\n" + "\n" + "\n" - + "\n" + "\n" + "\n" + "\n" - + "Page Redirection\n" + "\n" - + "\n" - + "If you are not redirected automatically, follow the link to latest release\n"; - } - - } - } diff --git a/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/spring/AcceptanceTests.java b/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/spring/AcceptanceTests.java index ffecd8cf..f50e44f2 100644 --- a/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/spring/AcceptanceTests.java +++ b/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/spring/AcceptanceTests.java @@ -45,22 +45,26 @@ import org.mockito.BDDMockito; import org.mockito.Mockito; import org.springframework.boot.test.rule.OutputCapture; +import org.springframework.cloud.release.cloud.docs.SpringCloudDocsAccessor; import org.springframework.cloud.release.internal.Releaser; import org.springframework.cloud.release.internal.ReleaserProperties; +import org.springframework.cloud.release.internal.buildsystem.BomParser; +import org.springframework.cloud.release.internal.buildsystem.GradleUpdater; +import org.springframework.cloud.release.internal.buildsystem.MavenBomParserAccessor; +import org.springframework.cloud.release.internal.buildsystem.ProjectPomUpdater; +import org.springframework.cloud.release.internal.buildsystem.TestPomReader; +import org.springframework.cloud.release.internal.buildsystem.TestUtils; import org.springframework.cloud.release.internal.docs.DocumentationUpdater; import org.springframework.cloud.release.internal.docs.TestDocumentationUpdater; import org.springframework.cloud.release.internal.git.GitTestUtils; import org.springframework.cloud.release.internal.git.ProjectGitHandler; -import org.springframework.cloud.release.internal.gradle.GradleUpdater; +import org.springframework.cloud.release.internal.github.ProjectGitHubHandler; import org.springframework.cloud.release.internal.options.Options; import org.springframework.cloud.release.internal.options.OptionsBuilder; -import org.springframework.cloud.release.internal.pom.ProjectPomUpdater; -import org.springframework.cloud.release.internal.pom.ProjectVersion; -import org.springframework.cloud.release.internal.pom.Projects; -import org.springframework.cloud.release.internal.pom.TestPomReader; -import org.springframework.cloud.release.internal.pom.TestUtils; -import org.springframework.cloud.release.internal.post.PostReleaseActions; -import org.springframework.cloud.release.internal.project.ProjectBuilder; +import org.springframework.cloud.release.internal.postrelease.PostReleaseActions; +import org.springframework.cloud.release.internal.project.ProjectCommandExecutor; +import org.springframework.cloud.release.internal.project.ProjectVersion; +import org.springframework.cloud.release.internal.project.Projects; import org.springframework.cloud.release.internal.sagan.Project; import org.springframework.cloud.release.internal.sagan.Release; import org.springframework.cloud.release.internal.sagan.SaganClient; @@ -94,10 +98,12 @@ public class AcceptanceTests { File cloudProjectFolder; - TestProjectGitHandler gitHandler; + TestProjectGitHubHandler gitHandler; NonAssertingTestProjectGitHandler nonAssertingGitHandler; + NonAssertingTestProjectGitHubHandler nonAssertingGitHubHandler; + SaganClient saganClient = Mockito.mock(SaganClient.class); ReleaserProperties releaserProperties; @@ -694,20 +700,23 @@ public class AcceptanceTests { private Releaser defaultReleaser(String expectedVersion, String projectName, ReleaserProperties properties) { - ProjectPomUpdater pomUpdater = new ProjectPomUpdater(properties); - ProjectBuilder projectBuilder = new ProjectBuilder(properties); - TestProjectGitHandler handler = new TestProjectGitHandler(properties, + ProjectPomUpdater pomUpdater = new ProjectPomUpdater(properties, + bomParsers(properties)); + ProjectCommandExecutor projectCommandExecutor = new ProjectCommandExecutor( + properties); + ProjectGitHandler gitHandler = new ProjectGitHandler(properties); + TestProjectGitHubHandler githubHandler = new TestProjectGitHubHandler(properties, expectedVersion, projectName); - TemplateGenerator templateGenerator = new TemplateGenerator(properties, handler); + TemplateGenerator templateGenerator = new TemplateGenerator(properties, + githubHandler); GradleUpdater gradleUpdater = new GradleUpdater(properties); SaganUpdater saganUpdater = new SaganUpdater(this.saganClient, this.releaserProperties); DocumentationUpdater documentationUpdater = new TestDocumentationUpdater( properties, - new TestDocumentationUpdater.TestProjectDocumentationUpdater(properties, - handler, "Brixton.SR1"), - new TestDocumentationUpdater.TestReleaseContentsUpdater(properties, - handler, templateGenerator)) { + SpringCloudDocsAccessor.testUpdater(gitHandler, "Brixton.SR1"), + gitHandler, new TestDocumentationUpdater.TestReleaseContentsUpdater( + properties, gitHandler, templateGenerator)) { @Override public File updateDocsRepo(ProjectVersion currentProject, String bomReleaseBranch) { @@ -716,17 +725,22 @@ public class AcceptanceTests { return file; } }; - Releaser releaser = new Releaser(releaserProperties, pomUpdater, projectBuilder, - handler, templateGenerator, gradleUpdater, saganUpdater, - documentationUpdater, this.postReleaseActions); - this.gitHandler = handler; + Releaser releaser = new Releaser(releaserProperties, pomUpdater, + projectCommandExecutor, gitHandler, githubHandler, templateGenerator, + gradleUpdater, saganUpdater, documentationUpdater, + this.postReleaseActions); + this.gitHandler = githubHandler; return releaser; } private Releaser defaultMetaReleaser(ReleaserProperties properties) { - ProjectPomUpdater pomUpdater = new ProjectPomUpdater(properties); - ProjectBuilder projectBuilder = new ProjectBuilder(properties); - NonAssertingTestProjectGitHandler handler = new NonAssertingTestProjectGitHandler( + ProjectPomUpdater pomUpdater = new ProjectPomUpdater(properties, + bomParsers(properties)); + ProjectCommandExecutor projectCommandExecutor = new ProjectCommandExecutor( + properties); + NonAssertingTestProjectGitHubHandler handler = new NonAssertingTestProjectGitHubHandler( + properties); + NonAssertingTestProjectGitHandler nonAssertingGitHandler = new NonAssertingTestProjectGitHandler( properties); TemplateGenerator templateGenerator = Mockito .spy(new TemplateGenerator(properties, handler)); @@ -735,10 +749,11 @@ public class AcceptanceTests { .spy(new SaganUpdater(this.saganClient, this.releaserProperties)); DocumentationUpdater documentationUpdater = Mockito .spy(new TestDocumentationUpdater(properties, - new TestDocumentationUpdater.TestProjectDocumentationUpdater( - properties, handler, "Brixton.SR1"), + SpringCloudDocsAccessor.testUpdater(nonAssertingGitHandler, + "Brixton.SR1"), + nonAssertingGitHandler, new TestDocumentationUpdater.TestReleaseContentsUpdater( - properties, handler, templateGenerator) { + properties, nonAssertingGitHandler, templateGenerator) { @Override public File updateProjectRepo(Projects projects) { File file = super.updateProjectRepo(projects); @@ -755,16 +770,23 @@ public class AcceptanceTests { return file; } }); - Releaser releaser = Mockito.spy(new Releaser(releaserProperties, pomUpdater, - projectBuilder, handler, templateGenerator, gradleUpdater, saganUpdater, - documentationUpdater, this.postReleaseActions)); - this.nonAssertingGitHandler = handler; + Releaser releaser = Mockito + .spy(new Releaser(releaserProperties, pomUpdater, projectCommandExecutor, + nonAssertingGitHandler, handler, templateGenerator, gradleUpdater, + saganUpdater, documentationUpdater, this.postReleaseActions)); + this.nonAssertingGitHubHandler = handler; + this.nonAssertingGitHandler = nonAssertingGitHandler; this.templateGenerator = templateGenerator; this.saganUpdater = saganUpdater; this.documentationUpdater = documentationUpdater; return releaser; } + private List bomParsers(ReleaserProperties properties) { + return Collections + .singletonList(MavenBomParserAccessor.cloudMavenBomParser(properties)); + } + private ReleaserProperties releaserProperties(File project, String branch) throws URISyntaxException { ReleaserProperties releaserProperties = new ReleaserProperties(); @@ -849,7 +871,7 @@ public class AcceptanceTests { return new String(Files.readAllBytes(file.toPath())); } - class TestProjectGitHandler extends ProjectGitHandler { + class TestProjectGitHubHandler extends ProjectGitHubHandler { final String expectedVersion; @@ -861,7 +883,7 @@ public class AcceptanceTests { boolean issueCreatedInStartSpringIo = false; - TestProjectGitHandler(ReleaserProperties properties, String expectedVersion, + TestProjectGitHubHandler(ReleaserProperties properties, String expectedVersion, String projectName) { super(properties); this.expectedVersion = expectedVersion; @@ -893,7 +915,7 @@ public class AcceptanceTests { } - class NonAssertingTestProjectGitHandler extends ProjectGitHandler { + class NonAssertingTestProjectGitHubHandler extends ProjectGitHubHandler { boolean closedMilestones = false; @@ -901,9 +923,7 @@ public class AcceptanceTests { boolean issueCreatedInStartSpringIo = false; - List clonedProjects = new ArrayList<>(); - - NonAssertingTestProjectGitHandler(ReleaserProperties properties) { + NonAssertingTestProjectGitHubHandler(ReleaserProperties properties) { super(properties); } @@ -928,6 +948,16 @@ public class AcceptanceTests { return "https://foo.bar.com/" + releaseVersion.toString(); } + } + + class NonAssertingTestProjectGitHandler extends ProjectGitHandler { + + List clonedProjects = new ArrayList<>(); + + NonAssertingTestProjectGitHandler(ReleaserProperties properties) { + super(properties); + } + @Override public File cloneReleaseTrainProject() { File file = super.cloneReleaseTrainProject(); diff --git a/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/spring/ReleaserApplicationEventTests.java b/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/spring/ReleaserApplicationEventTests.java index 9b48022e..444b9e64 100644 --- a/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/spring/ReleaserApplicationEventTests.java +++ b/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/spring/ReleaserApplicationEventTests.java @@ -63,6 +63,8 @@ public class ReleaserApplicationEventTests { @Configuration @EnableAutoConfiguration @ComponentScan({ "org.springframework.cloud.release.internal.options", + "org.springframework.cloud.release.cloud", + "org.springframework.cloud.release.internal.buildsystem", "org.springframework.cloud.release.internal.sagan", "org.springframework.cloud.release.internal.spring" }) static class Config { diff --git a/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/spring/SpringReleaserTests.java b/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/spring/SpringReleaserTests.java index b1f04a38..8b992b23 100644 --- a/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/spring/SpringReleaserTests.java +++ b/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/spring/SpringReleaserTests.java @@ -40,9 +40,9 @@ import org.springframework.cloud.release.internal.ReleaserProperties; import org.springframework.cloud.release.internal.ReleaserPropertiesAware; import org.springframework.cloud.release.internal.options.Options; import org.springframework.cloud.release.internal.options.OptionsBuilder; -import org.springframework.cloud.release.internal.pom.ProcessedProject; -import org.springframework.cloud.release.internal.pom.ProjectVersion; -import org.springframework.cloud.release.internal.pom.Projects; +import org.springframework.cloud.release.internal.project.ProcessedProject; +import org.springframework.cloud.release.internal.project.ProjectVersion; +import org.springframework.cloud.release.internal.project.Projects; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationEventPublisher;