diff --git a/.travis.yml b/.travis.yml index 8f99692484..d0459f06fa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -52,7 +52,7 @@ after_script: # split monorepo to packages (done via Travis Cron Job) - | if [[ $TRAVIS_EVENT_TYPE = "cron" && $MONOREPO_SPLIT != "" ]]; then - packages/MonorepoBuilder/bin/monorepo-builder split + packages/MonorepoBuilder/bin/monorepo-builder split -v fi - | echo $TRAVIS_EVENT_TYPE diff --git a/composer.json b/composer.json index 3ef94ae9a8..bf0ae4657f 100644 --- a/composer.json +++ b/composer.json @@ -33,7 +33,7 @@ }, "require-dev": { "nette/application": "^2.4", - "phpstan/phpstan": "^0.9", + "phpstan/phpstan": "0.9.*", "phpunit/phpunit": "^7.0", "slam/php-cs-fixer-extensions": "^1.15", "tracy/tracy": "^2.4" diff --git a/packages/MonorepoBuilder/packages/Split/bash/subsplit.sh b/packages/MonorepoBuilder/packages/Split/bash/subsplit.sh index c00d3c0ccc..8afcc51c44 100755 --- a/packages/MonorepoBuilder/packages/Split/bash/subsplit.sh +++ b/packages/MonorepoBuilder/packages/Split/bash/subsplit.sh @@ -8,27 +8,32 @@ # author: https://github.com/simensen # source: https://github.com/dflydev/git-subsplit/blob/master/git-subsplit.sh # +# includes merge of PRs +# - https://github.com/dflydev/git-subsplit/pull/30/files +# +# exit code: +# 1 git add-remote/pull/fetch operation failed +# 2 git push operation failed +# 3 failed on git subtree command + +# show help if there are no params passed if [ $# -eq 0 ]; then - set -- -h + set -- -h fi + OPTS_SPEC="\ -git subsplit init url -git subsplit publish splits --heads= --tags= --splits= -git subsplit update +subsplit.sh --splits= --branches= --tags= + +For example: +subsplit.sh --splits=packages/MonorepoBuilder:git@github.com:Symplify/MonorepoBuilder.git --branches=master --tags=v5.0 -- h,help show the help -q quiet debug show plenty of debug output -n,dry-run do everything except actually send the updates -work-dir directory that contains the subsplit working directory - - options for 'publish' -heads= only publish for listed heads instead of all heads -no-heads do not publish any heads -tags= only publish for listed tags instead of all tags -no-tags do not publish any tags -update fetch updates from repository before publishing -rebuild-tags rebuild all tags (as opposed to skipping tags that are already synced) +dry-run do everything except actually send the updates +work-dir= directory that contains the subsplit working directory +splits= listed repositories , e.g. '--splits=packages/MonorepoBuilder:git@github.com:Symplify/MonorepoBuilder.git' +branches= publish for listed branches, e.g '--branches=master', '--branches=master dev', +tags= publish for listed tags, e.g. '--tags=v5.0', '--tags=v5.0 v5.5' " eval "$(echo "$OPTS_SPEC" | git rev-parse --parseopt -- "$@" || echo exit $?)" @@ -38,313 +43,232 @@ DEBUG=" :DEBUG >" PATH=$PATH:$(git --exec-path) -. git-sh-setup +# git-sh-setup if [ "$(hash git-subtree &>/dev/null && echo OK)" = "" ] then - die "Git subplit needs git subtree; install git subtree or upgrade git to >=1.7.11" + die "Git subsplit needs git subtree; install git subtree or upgrade git to >=1.7.11" fi -ANNOTATE= -QUIET= COMMAND= SPLITS= -REPO_URL= +REPO_URL=".git" WORK_DIR="${PWD}/.subsplit" -HEADS= -NO_HEADS= +BRANCHES= TAGS= -NO_TAGS= -REBUILD_TAGS= DRY_RUN= VERBOSE= subsplit_main() { - while [ $# -gt 0 ]; do - opt="$1" - shift - case "$opt" in - -q) QUIET=1 ;; - --debug) VERBOSE=1 ;; - --heads) HEADS="$1"; shift ;; - --no-heads) NO_HEADS=1 ;; - --tags) TAGS="$1"; shift ;; - --no-tags) NO_TAGS=1 ;; - --update) UPDATE=1 ;; - -n) DRY_RUN="--dry-run" ;; - --dry-run) DRY_RUN="--dry-run" ;; - --rebuild-tags) REBUILD_TAGS=1 ;; - --) break ;; - *) die "Unexpected option: $opt" ;; - esac - done - - COMMAND="$1" - shift - - case "$COMMAND" in - init) - if [ $# -lt 1 ]; then die "init command requires url to be passed as first argument"; fi - REPO_URL="$1" - shift - subsplit_init - ;; - publish) - if [ $# -lt 1 ]; then die "publish command requires splits to be passed as first argument"; fi - SPLITS="$1" - shift - subsplit_publish - ;; - update) - subsplit_update - ;; - *) die "Unknown command '$COMMAND'" ;; - esac + while [ $# -gt 0 ]; do + opt="$1" + shift + case "$opt" in + --debug) VERBOSE=1 ;; + --branches) BRANCHES="$1"; shift ;; + --tags) TAGS="$1"; shift ;; + --dry-run) DRY_RUN="--dry-run" ;; + --work-dir) WORK_DIR="$1"; shift ;; + --) break ;; + *) die "Unexpected option: $opt" ;; + esac + done + + if [ $# -lt 1 ]; then die "publish command requires splits to be passed as first argument"; fi + SPLITS="$1" + shift + subsplit_publish } + say() { - if [ -z "$QUIET" ]; - then - echo "$@" >&2 - fi + echo "$@" >&2 } -subsplit_require_work_dir() +fatal() { - if [ ! -e "$WORK_DIR" ] - then - die "Working directory not found at ${WORK_DIR}; please run init first" - fi - - if [ -n "$VERBOSE" ]; - then - echo "${DEBUG} pushd \"${WORK_DIR}\" >/dev/null" - fi - - pushd "$WORK_DIR" >/dev/null + RC=${1:-1} + shift + say "${@:-## Error occurs}" + popd >/dev/null + exit $RC } subsplit_init() { - if [ -e "$WORK_DIR" ] - then - die "Working directory already found at ${WORK_DIR}; please remove or run update" - fi + if [ -e "$WORK_DIR" ] + then + die "Working directory already found at ${WORK_DIR}; please remove or run update" + fi - say "Initializing subsplit from origin (${REPO_URL})" + say "Initializing subsplit from origin (${REPO_URL})" - if [ -n "$VERBOSE" ]; - then - echo "${DEBUG} git clone -q \"${REPO_URL}\" \"${WORK_DIR}\"" - fi + if [ -n "$VERBOSE" ]; + then + echo "${DEBUG} git clone -q \"${REPO_URL}\" \"${WORK_DIR}\"" + fi - git clone -q "$REPO_URL" "$WORK_DIR" || die "Could not clone repository" + git clone -q "$REPO_URL" "$WORK_DIR" || die "Could not clone repository" } subsplit_publish() { - subsplit_require_work_dir - - if [ -n "$UPDATE" ]; - then - subsplit_update - fi - - if [ -z "$HEADS" ] && [ -z "$NO_HEADS" ] - then - # If heads are not specified and we want heads, discover them. - HEADS="$(git ls-remote origin 2>/dev/null | grep "refs/heads/" | cut -f3- -d/)" - - if [ -n "$VERBOSE" ]; - then - echo "${DEBUG} HEADS=\"${HEADS}\"" - fi - fi - - if [ -z "$TAGS" ] && [ -z "$NO_TAGS" ] - then - # If tags are not specified and we want tags, discover them. - TAGS="$(git ls-remote origin 2>/dev/null | grep -v "\^{}" | grep "refs/tags/" | cut -f3 -d/)" - - if [ -n "$VERBOSE" ]; - then - echo "${DEBUG} TAGS=\"${TAGS}\"" - fi - fi - - for SPLIT in $SPLITS - do - SUBPATH=$(echo "$SPLIT" | cut -f1 -d:) - REMOTE_URL=$(echo "$SPLIT" | cut -f2- -d:) - REMOTE_NAME=$(echo "$SPLIT" | git hash-object --stdin) - - if [ -n "$VERBOSE" ]; - then - echo "${DEBUG} SUBPATH=${SUBPATH}" - echo "${DEBUG} REMOTE_URL=${REMOTE_URL}" - echo "${DEBUG} REMOTE_NAME=${REMOTE_NAME}" - fi - - if ! git remote | grep "^${REMOTE_NAME}$" >/dev/null - then - git remote add "$REMOTE_NAME" "$REMOTE_URL" - - if [ -n "$VERBOSE" ]; - then - echo "${DEBUG} git remote add \"${REMOTE_NAME}\" \"${REMOTE_URL}\"" - fi - fi - - - say "Syncing ${SUBPATH} -> ${REMOTE_URL}" - - for HEAD in $HEADS - do - if [ -n "$VERBOSE" ]; - then - echo "${DEBUG} git show-ref --quiet --verify -- \"refs/remotes/origin/${HEAD}\"" - fi - - if ! git show-ref --quiet --verify -- "refs/remotes/origin/${HEAD}" - then - say " - skipping head '${HEAD}' (does not exist)" - continue - fi - LOCAL_BRANCH="${REMOTE_NAME}-branch-${HEAD}" - - if [ -n "$VERBOSE" ]; - then - echo "${DEBUG} LOCAL_BRANCH=\"${LOCAL_BRANCH}\"" - fi - - say " - syncing branch '${HEAD}'" - - git checkout master >/dev/null 2>&1 - git branch -D "$LOCAL_BRANCH" >/dev/null 2>&1 - git branch -D "${LOCAL_BRANCH}-checkout" >/dev/null 2>&1 - git checkout -b "${LOCAL_BRANCH}-checkout" "origin/${HEAD}" >/dev/null 2>&1 - git subtree split -q --prefix="$SUBPATH" --branch="$LOCAL_BRANCH" "origin/${HEAD}" >/dev/null - RETURNCODE=$? - - if [ -n "$VERBOSE" ]; - then - echo "${DEBUG} git checkout master >/dev/null 2>&1" - echo "${DEBUG} git branch -D \"$LOCAL_BRANCH\" >/dev/null 2>&1" - echo "${DEBUG} git branch -D \"${LOCAL_BRANCH}-checkout\" >/dev/null 2>&1" - echo "${DEBUG} git checkout -b \"${LOCAL_BRANCH}-checkout\" \"origin/${HEAD}\" >/dev/null 2>&1" - echo "${DEBUG} git subtree split -q --prefix=\"$SUBPATH\" --branch=\"$LOCAL_BRANCH\" \"origin/${HEAD}\" >/dev/null" - fi - - if [ $RETURNCODE -eq 0 ] - then - PUSH_CMD="git push -q ${DRY_RUN} --force $REMOTE_NAME ${LOCAL_BRANCH}:${HEAD}" - - if [ -n "$VERBOSE" ]; - then - echo "${DEBUG} $PUSH_CMD" - fi - - if [ -n "$DRY_RUN" ] - then - echo \# $PUSH_CMD - $PUSH_CMD - else - $PUSH_CMD - fi - fi - done - - for TAG in $TAGS - do - if [ -n "$VERBOSE" ]; - then - echo "${DEBUG} git show-ref --quiet --verify -- \"refs/tags/${TAG}\"" - fi - - if ! git show-ref --quiet --verify -- "refs/tags/${TAG}" - then - say " - skipping tag '${TAG}' (does not exist)" - continue - fi - LOCAL_TAG="${REMOTE_NAME}-tag-${TAG}" - - if [ -n "$VERBOSE" ]; - then - echo "${DEBUG} LOCAL_TAG="${LOCAL_TAG}"" - fi - - if git branch | grep "${LOCAL_TAG}$" >/dev/null && [ -z "$REBUILD_TAGS" ] - then - say " - skipping tag '${TAG}' (already synced)" - continue - fi - - if [ -n "$VERBOSE" ]; - then - echo "${DEBUG} git branch | grep \"${LOCAL_TAG}$\" >/dev/null && [ -z \"${REBUILD_TAGS}\" ]" - fi - - say " - syncing tag '${TAG}'" - say " - deleting '${LOCAL_TAG}'" - git branch -D "$LOCAL_TAG" >/dev/null 2>&1 - - if [ -n "$VERBOSE" ]; - then - echo "${DEBUG} git branch -D \"${LOCAL_TAG}\" >/dev/null 2>&1" - fi - - say " - subtree split for '${TAG}'" - git subtree split -q --annotate="${ANNOTATE}" --prefix="$SUBPATH" --branch="$LOCAL_TAG" "$TAG" >/dev/null - RETURNCODE=$? - - if [ -n "$VERBOSE" ]; - then - echo "${DEBUG} git subtree split -q --annotate=\"${ANNOTATE}\" --prefix=\"$SUBPATH\" --branch=\"$LOCAL_TAG\" \"$TAG\" >/dev/null" - fi - - say " - subtree split for '${TAG}' [DONE]" - if [ $RETURNCODE -eq 0 ] - then - PUSH_CMD="git push -q ${DRY_RUN} --force ${REMOTE_NAME} ${LOCAL_TAG}:refs/tags/${TAG}" - - if [ -n "$VERBOSE" ]; - then - echo "${DEBUG} PUSH_CMD=\"${PUSH_CMD}\"" - fi - - if [ -n "$DRY_RUN" ] - then - echo \# $PUSH_CMD - $PUSH_CMD - else - $PUSH_CMD - fi - fi - done - done - - popd >/dev/null -} - -subsplit_update() -{ - subsplit_require_work_dir - - say "Updating subsplit from origin" - - git fetch -q -t origin - git checkout master - git reset --hard origin/master - - if [ -n "$VERBOSE" ]; - then - echo "${DEBUG} git fetch -q -t origin" - echo "${DEBUG} git checkout master" - echo "${DEBUG} git reset --hard origin/master" - fi - - popd >/dev/null + subsplit_init + + for SPLIT in $SPLITS + do + SUBPATH=$(echo "$SPLIT" | cut -f1 -d:) + REMOTE_URL=$(echo "$SPLIT" | cut -f2- -d:) + REMOTE_NAME=$(echo "$SPLIT" | git hash-object --stdin) + + if [ -n "$VERBOSE" ]; + then + echo "${DEBUG} SUBPATH=${SUBPATH}" + echo "${DEBUG} REMOTE_URL=${REMOTE_URL}" + echo "${DEBUG} REMOTE_NAME=${REMOTE_NAME}" + fi + + if ! git remote | grep "^${REMOTE_NAME}$" >/dev/null + then + git remote add "$REMOTE_NAME" "$REMOTE_URL" || fatal 1 "## Failed adding remote $REMOTE_NAME $REMOTE_URL" + + if [ -n "$VERBOSE" ]; + then + echo "${DEBUG} git remote add \"${REMOTE_NAME}\" \"${REMOTE_URL}\"" + fi + fi + + say "Syncing ${SUBPATH} -> ${REMOTE_URL}" + + # split for branches + for BRANCH in $BRANCHES + do + if [ -n "$VERBOSE" ]; + then + echo "${DEBUG} git show-ref --quiet --verify -- \"refs/remotes/origin/${BRANCH}\"" + fi + + if ! git show-ref --quiet --verify -- "refs/remotes/origin/${BRANCH}" + then + say " - skipping head '${BRANCH}' (does not exist)" + continue + fi + LOCAL_BRANCH="${REMOTE_NAME}-branch-${BRANCH}" + + if [ -n "$VERBOSE" ]; + then + echo "${DEBUG} LOCAL_BRANCH=\"${LOCAL_BRANCH}\"" + fi + + say " - syncing branch '${BRANCH}'" + + git checkout master >/dev/null 2>&1 || fatal 1 "## Failed while git checkout master" + git branch -D "$LOCAL_BRANCH" >/dev/null 2>&1 + git branch -D "${LOCAL_BRANCH}-checkout" >/dev/null 2>&1 + git checkout -b "${LOCAL_BRANCH}-checkout" "origin/${BRANCH}" >/dev/null 2>&1 || fatal 1 "## Failed while git checkout" + git subtree split -q --prefix="$SUBPATH" --branch="$LOCAL_BRANCH" "origin/${BRANCH}" >/dev/null || fatal 3 "## Failed while git subtree split for BRANCHS" + RETURNCODE=$? + + if [ -n "$VERBOSE" ]; + then + echo "${DEBUG} git checkout master >/dev/null 2>&1" + echo "${DEBUG} git branch -D \"$LOCAL_BRANCH\" >/dev/null 2>&1" + echo "${DEBUG} git branch -D \"${LOCAL_BRANCH}-checkout\" >/dev/null 2>&1" + echo "${DEBUG} git checkout -b \"${LOCAL_BRANCH}-checkout\" \"origin/${BRANCH}\" >/dev/null 2>&1" + echo "${DEBUG} git subtree split -q --prefix=\"$SUBPATH\" --branch=\"$LOCAL_BRANCH\" \"origin/${BRANCH}\" >/dev/null" + fi + + if [ $RETURNCODE -eq 0 ] + then + PUSH_CMD="git push -q ${DRY_RUN} --force $REMOTE_NAME ${LOCAL_BRANCH}:${BRANCH}" + + if [ -n "$VERBOSE" ]; + then + echo "${DEBUG} $PUSH_CMD" + fi + + if [ -n "$DRY_RUN" ] + then + echo \# $PUSH_CMD + $PUSH_CMD + else + $PUSH_CMD || fatal 2 "## Failed pushing branchs to remote repo" + fi + fi + done + + # split for tags + for TAG in $TAGS + do + if [ -n "$VERBOSE" ]; + then + echo "${DEBUG} git show-ref --quiet --verify -- \"refs/tags/${TAG}\"" + fi + + if ! git show-ref --quiet --verify -- "refs/tags/${TAG}" + then + say " - skipping tag '${TAG}' (does not exist)" + continue + fi + LOCAL_TAG="${REMOTE_NAME}-tag-${TAG}" + + if [ -n "$VERBOSE" ]; + then + echo "${DEBUG} LOCAL_TAG="${LOCAL_TAG}"" + fi + + if git branch | grep "${LOCAL_TAG}$" >/dev/null + then + say " - skipping tag '${TAG}' (already synced)" + continue + fi + + if [ -n "$VERBOSE" ]; + then + echo "${DEBUG} git branch | grep \"${LOCAL_TAG}$\" >/dev/null" + fi + + say " - syncing tag '${TAG}'" + say " - deleting '${LOCAL_TAG}'" + git branch -D "$LOCAL_TAG" >/dev/null 2>&1 + + if [ -n "$VERBOSE" ]; + then + echo "${DEBUG} git branch -D \"${LOCAL_TAG}\" >/dev/null 2>&1" + fi + + say " - subtree split for '${TAG}'" + git subtree split -q --prefix="$SUBPATH" --branch="$LOCAL_TAG" "$TAG" >/dev/null || fatal 3 "## Failed while git subtree split for TAGS" + RETURNCODE=$? + + if [ -n "$VERBOSE" ]; + then + echo "${DEBUG} git subtree split -q --prefix=\"$SUBPATH\" --branch=\"$LOCAL_TAG\" \"$TAG\" >/dev/null" + fi + + say " - subtree split for '${TAG}' [DONE]" + if [ $RETURNCODE -eq 0 ] + then + PUSH_CMD="git push -q ${DRY_RUN} --force ${REMOTE_NAME} ${LOCAL_TAG}:refs/tags/${TAG}" + + if [ -n "$VERBOSE" ]; + then + echo "${DEBUG} PUSH_CMD=\"${PUSH_CMD}\"" + fi + + if [ -n "$DRY_RUN" ] + then + echo \# $PUSH_CMD + $PUSH_CMD + else + $PUSH_CMD || fatal 2 "## Failed pushing tags to remote repo" + fi + fi + done + done + + popd >/dev/null } -subsplit_main "$@" +subsplit_main "$@" \ No newline at end of file diff --git a/packages/MonorepoBuilder/packages/Split/src/Command/SplitCommand.php b/packages/MonorepoBuilder/packages/Split/src/Command/SplitCommand.php index f0bf6a4777..1e1470cb79 100644 --- a/packages/MonorepoBuilder/packages/Split/src/Command/SplitCommand.php +++ b/packages/MonorepoBuilder/packages/Split/src/Command/SplitCommand.php @@ -9,7 +9,6 @@ use Symfony\Component\Console\Style\SymfonyStyle; use Symplify\MonorepoBuilder\Split\Configuration\RepositoryGuard; use Symplify\MonorepoBuilder\Split\PackageToRepositorySplitter; -use Symplify\MonorepoBuilder\Split\Process\ProcessFactory; use Symplify\PackageBuilder\Console\Command\CommandNaming; final class SplitCommand extends Command @@ -29,11 +28,6 @@ final class SplitCommand extends Command */ private $directoriesToRepositories = []; - /** - * @var ProcessFactory - */ - private $processFactory; - /** * @var string */ @@ -51,7 +45,6 @@ public function __construct( SymfonyStyle $symfonyStyle, RepositoryGuard $repositoryGuard, array $directoriesToRepositories, - ProcessFactory $processFactory, string $rootDirectory, PackageToRepositorySplitter $packageToRepositorySplitter ) { @@ -60,7 +53,6 @@ public function __construct( $this->symfonyStyle = $symfonyStyle; $this->repositoryGuard = $repositoryGuard; $this->directoriesToRepositories = $directoriesToRepositories; - $this->processFactory = $processFactory; $this->rootDirectory = $rootDirectory; $this->packageToRepositorySplitter = $packageToRepositorySplitter; } @@ -74,22 +66,16 @@ protected function execute(InputInterface $input, OutputInterface $output): int { $this->repositoryGuard->ensureIsRepositoryDirectory($this->rootDirectory); - $subsplitDirectory = $this->getSubsplitDirectory(); - - // init subsbplit - $process = $this->processFactory->createSubsplitInit(); - $process->run(); - - $this->symfonyStyle->success(sprintf('Directory "%s" with local clone created', $subsplitDirectory)); + $isVerbose = $output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE; $this->packageToRepositorySplitter->splitDirectoriesToRepositories( $this->directoriesToRepositories, - $this->rootDirectory + $this->rootDirectory, + $isVerbose ); - FileSystem::delete($subsplitDirectory); - - $this->symfonyStyle->success(sprintf('Directory "%s" cleaned', $subsplitDirectory)); + FileSystem::delete($this->getSubsplitDirectory()); + $this->symfonyStyle->success(sprintf('Temporary directory "%s" cleaned', $this->getSubsplitDirectory())); // success return 0; diff --git a/packages/MonorepoBuilder/packages/Split/src/PackageToRepositorySplitter.php b/packages/MonorepoBuilder/packages/Split/src/PackageToRepositorySplitter.php index 54bf6d3e59..166c0c95db 100644 --- a/packages/MonorepoBuilder/packages/Split/src/PackageToRepositorySplitter.php +++ b/packages/MonorepoBuilder/packages/Split/src/PackageToRepositorySplitter.php @@ -59,17 +59,18 @@ public function __construct( /** * @param mixed[] $splitConfig */ - public function splitDirectoriesToRepositories(array $splitConfig, string $rootDirectory): void + public function splitDirectoriesToRepositories(array $splitConfig, string $rootDirectory, bool $isVerbose): void { $theMostRecentTag = $this->getMostRecentTag($rootDirectory); foreach ($splitConfig as $localSubdirectory => $remoteRepository) { $this->fileSystemGuard->ensureDirectoryExists($localSubdirectory); - $process = $this->processFactory->createSubsplitPublish( + $process = $this->processFactory->createSubsplit( $theMostRecentTag, $localSubdirectory, - $remoteRepository + $remoteRepository, + $isVerbose ); $this->symfonyStyle->note('Running: ' . $process->getCommandLine()); $process->start(); diff --git a/packages/MonorepoBuilder/packages/Split/src/Process/ProcessFactory.php b/packages/MonorepoBuilder/packages/Split/src/Process/ProcessFactory.php index 7016bd42bf..a36a6a1f5f 100644 --- a/packages/MonorepoBuilder/packages/Split/src/Process/ProcessFactory.php +++ b/packages/MonorepoBuilder/packages/Split/src/Process/ProcessFactory.php @@ -28,25 +28,22 @@ public function __construct(RepositoryGuard $repositoryGuard, string $rootDirect $this->rootDirectory = $rootDirectory; } - public function createSubsplitInit(): Process - { - $commandLine = [realpath(self::SUBSPLIT_BASH_FILE), 'init', '.git']; - return $this->createProcessFromCommandLine($commandLine); - } - - public function createSubsplitPublish( + public function createSubsplit( string $theMostRecentTag, string $directory, - string $remoteRepository + string $remoteRepository, + bool $isVerbose ): Process { $this->repositoryGuard->ensureIsRepository($remoteRepository); + $commandLine = [ realpath(self::SUBSPLIT_BASH_FILE), - 'publish', - '--heads=master', + '--branches=master', $theMostRecentTag ? sprintf('--tags=%s', $theMostRecentTag) : '', $directory . ':' . $remoteRepository, + $isVerbose ? '--debug' : '', ]; + return $this->createProcessFromCommandLine($commandLine); } diff --git a/packages/MonorepoBuilder/packages/Split/tests/Configuration/RepositoryGuardTest.php b/packages/MonorepoBuilder/packages/Split/tests/Configuration/RepositoryGuardTest.php new file mode 100644 index 0000000000..f19e4a3aa7 --- /dev/null +++ b/packages/MonorepoBuilder/packages/Split/tests/Configuration/RepositoryGuardTest.php @@ -0,0 +1,44 @@ +repositoryGuard = $this->container->get(RepositoryGuard::class); + } + + /** + * @dataProvider provideDataForEnsureIsRepository() + * @doesNotPerformAssertions + */ + public function testValid(string $repository): void + { + $this->repositoryGuard->ensureIsRepository($repository); + } + + public function provideDataForEnsureIsRepository(): Iterator + { + yield ['.git']; + yield ['git@github.com:Symplify/Symplify.git']; + yield ['https://github.com/Symplify/Symplify.git']; + } + + public function testInvalid(): Iterator + { + $this->expectException(InvalidRepositoryFormatException::class); + + $this->repositoryGuard->ensureIsRepository('http://github.com/Symplify/Symplify'); + } +} diff --git a/packages/MonorepoBuilder/packages/Split/tests/Process/ProcessFactoryTest.php b/packages/MonorepoBuilder/packages/Split/tests/Process/ProcessFactoryTest.php index 837f9f5dc7..7e06784a9f 100644 --- a/packages/MonorepoBuilder/packages/Split/tests/Process/ProcessFactoryTest.php +++ b/packages/MonorepoBuilder/packages/Split/tests/Process/ProcessFactoryTest.php @@ -2,7 +2,6 @@ namespace Symplify\MonorepoBuilder\Split\Tests\Process; -use Nette\Utils\FileSystem; use Symplify\MonorepoBuilder\Split\Process\ProcessFactory; use Symplify\MonorepoBuilder\Split\Tests\AbstractContainerAwareTestCase; @@ -20,14 +19,16 @@ protected function setUp(): void public function test(): void { - $subsplitInitProcess = $this->processFactory->createSubsplitInit(); + $subsplitProcess = $this->processFactory->createSubsplit( + '', + 'localDirectory', + 'git@github.com:Symplify/Symplify.git', + false + ); - $subsplitInitProcess->run(); - $this->assertDirectoryExists(getcwd() . '/.subsplit'); - } + $subsplitRealpath = realpath(__DIR__ . '/../../bash/subsplit.sh'); + $commandLine = "'" . $subsplitRealpath . "' '--branches=master' '' 'localDirectory:git@github.com:Symplify/Symplify.git' ''"; - protected function tearDown(): void - { - FileSystem::delete(getcwd() . '/.subsplit'); + $this->assertSame($commandLine, $subsplitProcess->getCommandLine()); } } diff --git a/packages/MonorepoBuilder/tests/ComposerJsonDecorator/AutoloadRelativePathComposerJsonDecorator/AutoloadRelativePathComposerJsonDecoratorTest.php b/packages/MonorepoBuilder/tests/ComposerJsonDecorator/AutoloadRelativePathComposerJsonDecorator/AutoloadRelativePathComposerJsonDecoratorTest.php index d9a5f3e760..98dac92601 100644 --- a/packages/MonorepoBuilder/tests/ComposerJsonDecorator/AutoloadRelativePathComposerJsonDecorator/AutoloadRelativePathComposerJsonDecoratorTest.php +++ b/packages/MonorepoBuilder/tests/ComposerJsonDecorator/AutoloadRelativePathComposerJsonDecorator/AutoloadRelativePathComposerJsonDecoratorTest.php @@ -8,11 +8,6 @@ final class AutoloadRelativePathComposerJsonDecoratorTest extends TestCase { - /** - * @var string - */ - private const RELATIVE_SOURCE_PATH = 'packages/MonorepoBuilder/tests/ComposerJsonDecorator/AutoloadRelativePathComposerJsonDecorator/Source'; - /** * @var mixed[] */ @@ -27,23 +22,6 @@ final class AutoloadRelativePathComposerJsonDecoratorTest extends TestCase ], ]; - /** - * @var mixed[] - */ - private $expectedComposerJson = [ - 'autoload' => [ - 'psr-4' => [ - 'App\\' => self::RELATIVE_SOURCE_PATH . '/src', - 'Shopsys\\' => [ - self::RELATIVE_SOURCE_PATH . '/app/', - self::RELATIVE_SOURCE_PATH . '/src/Shopsys/', - ], - ], - 'files' => [self::RELATIVE_SOURCE_PATH . '/src/SomeFile.php'], - 'classmap' => [self::RELATIVE_SOURCE_PATH . '/src/SomeClass.php'], - ], - ]; - /** * @var AutoloadRelativePathComposerJsonDecorator */ @@ -62,6 +40,33 @@ public function test(): void { $decorated = $this->autoloadRelativePathComposerJsonDecorator->decorate($this->composerJson); - $this->assertSame($this->expectedComposerJson, $decorated); + $this->assertSame($this->getExpectedComposerJson(), $decorated); + } + + /** + * @return mixed[] + */ + private function getExpectedComposerJson(): array + { + return [ + 'autoload' => [ + 'psr-4' => [ + 'App\\' => $this->getRelativeSourcePath() . '/src', + 'Shopsys\\' => [ + $this->getRelativeSourcePath() . '/app/', + $this->getRelativeSourcePath() . '/src/Shopsys/', + ], + ], + 'files' => [$this->getRelativeSourcePath() . '/src/SomeFile.php'], + 'classmap' => [$this->getRelativeSourcePath() . '/src/SomeClass.php'], + ], + ]; + } + + private function getRelativeSourcePath(): string + { + $prefix = defined('SYMPLIFY_MONOREPO') ? 'packages/MonorepoBuilder/' : ''; + + return $prefix . 'tests/ComposerJsonDecorator/AutoloadRelativePathComposerJsonDecorator/Source'; } }