| # This script drives creation of a perforce repository and checks | |
| # that CTest can update from it. | |
| #----------------------------------------------------------------------------- | |
| # Test in a directory next to this script. | |
| get_filename_component(TOP "${CMAKE_CURRENT_LIST_FILE}" PATH) | |
| set(P4_TOP "${TOP}") | |
| string(APPEND TOP "/@CTestUpdateP4_DIR@") | |
| # Include code common to all update tests. | |
| set(REPOSITORY_FILE_PREFIX "//ctest/") | |
| include("@CMAKE_CURRENT_SOURCE_DIR@/CTestUpdateCommon.cmake") | |
| #----------------------------------------------------------------------------- | |
| # Perforce server options | |
| set(P4_HOST localhost) | |
| set(P4_PORT 1888) | |
| #----------------------------------------------------------------------------- | |
| # Report p4 tools in use and set its defaults | |
| message("Using P4 tools:") | |
| set(P4 "@P4_EXECUTABLE@") | |
| set(P4D "@P4D_EXECUTABLE@") | |
| message(" p4 = ${P4}") | |
| message(" p4d = ${P4D}") | |
| set(P4_CLIENT -c ctest_p4) | |
| set(P4_OPTIONS -H ${P4_HOST} -p ${P4_PORT}) | |
| set(P4CMD ${P4} ${P4_OPTIONS}) | |
| #----------------------------------------------------------------------------- | |
| # Start the Perforce server | |
| if(UNIX) | |
| set(P4_ROOT ${P4_TOP}/perforce) | |
| message("Starting p4d on '${P4_ROOT}' listening on port ${P4_PORT}...") | |
| # Stop a previous instance of Perforce running | |
| execute_process( | |
| WORKING_DIRECTORY ${TOP} | |
| COMMAND ${P4CMD} admin stop | |
| OUTPUT_QUIET | |
| ERROR_QUIET | |
| ) | |
| # Make sure we don't have a perforce directory from a previous run | |
| file(REMOVE_RECURSE ${P4_ROOT}) | |
| file(MAKE_DIRECTORY ${P4_ROOT}) | |
| set(P4_SERVER "nohup '${P4D}' -d -r '${P4_ROOT}'") | |
| string(APPEND P4_SERVER " -L '${P4_ROOT}/p4.log'") | |
| string(APPEND P4_SERVER " -J '${P4_ROOT}/journal'") | |
| string(APPEND P4_SERVER " -p ${P4_PORT} >/dev/null 2>&1 &") | |
| message("Server command line: ${P4_SERVER}") | |
| execute_process( | |
| COMMAND sh -c " | |
| ${P4_SERVER} | |
| for i in 1 2 3 4 5 6 7 8 9 10; do | |
| echo 'Waiting for server to start...' | |
| sleep 1 | |
| if '${P4}' -H ${P4_HOST} -p ${P4_PORT} help >/dev/null 2>&1; then | |
| echo 'Server started.' | |
| exit | |
| fi | |
| done | |
| echo 'Gave up waiting for server to start.' | |
| sed 's/^/ /' '${P4_ROOT}/p4.log' | |
| " | |
| ) | |
| endif() | |
| #----------------------------------------------------------------------------- | |
| # Initialize the testing directory. | |
| message("Creating test directory...") | |
| init_testing() | |
| #----------------------------------------------------------------------------- | |
| # Create the repository. | |
| message("Creating depot...") | |
| file(WRITE ${TOP}/depot.spec "Depot: ctest\n") | |
| file(APPEND ${TOP}/depot.spec "Type: local\n") | |
| file(APPEND ${TOP}/depot.spec "Map: ctest/...\n") | |
| run_child( | |
| WORKING_DIRECTORY ${TOP} | |
| COMMAND ${P4CMD} depot -i | |
| INPUT_FILE ${TOP}/depot.spec | |
| ) | |
| #----------------------------------------------------------------------------- | |
| # Import initial content into the repository. | |
| message("Importing content...") | |
| create_content(user-source) | |
| message("Creating client spec...") | |
| file(WRITE ${TOP}/client.spec "Client: ctest_p4\n") | |
| file(APPEND ${TOP}/client.spec "Root: ${TOP}/user-source\n") | |
| file(APPEND ${TOP}/client.spec "View: //ctest/... //ctest_p4/...\n") | |
| run_child( | |
| WORKING_DIRECTORY ${TOP}/user-source | |
| COMMAND ${P4CMD} client -i | |
| INPUT_FILE ${TOP}/client.spec | |
| ) | |
| # After creating the depot and the client view, all P4 commands need to | |
| # have the client spec passed to them | |
| list(APPEND P4CMD ${P4_CLIENT}) | |
| message("Adding files to repository") | |
| file(GLOB_RECURSE files ${TOP}/user-source/*) | |
| foreach(filename IN LISTS files) | |
| run_child( | |
| WORKING_DIRECTORY ${TOP}/user-source | |
| COMMAND ${P4CMD} add ${filename} | |
| ) | |
| endforeach() | |
| message("Submitting changes to repository") | |
| run_child( | |
| WORKING_DIRECTORY ${TOP}/user-source | |
| COMMAND ${P4CMD} submit -d "CTEST: Initial content" | |
| ) | |
| message("Tagging the repository") | |
| file(WRITE ${TOP}/label.spec "Label: r1\n") | |
| file(APPEND ${TOP}/label.spec "View: //ctest/...\n") | |
| run_child( | |
| WORKING_DIRECTORY ${TOP}/user-source | |
| COMMAND ${P4CMD} label -i | |
| INPUT_FILE ${TOP}/label.spec | |
| ) | |
| run_child( | |
| WORKING_DIRECTORY ${TOP}/user-source | |
| COMMAND ${P4CMD} labelsync -l r1 | |
| ) | |
| #----------------------------------------------------------------------------- | |
| # Make changes in the working tree. | |
| message("Changing content...") | |
| update_content(user-source files_added files_removed dirs_added) | |
| foreach(filename IN LISTS files_added) | |
| message("add: ${filename}") | |
| run_child( | |
| WORKING_DIRECTORY ${TOP}/user-source | |
| COMMAND ${P4CMD} add ${TOP}/user-source/${filename} | |
| ) | |
| endforeach() | |
| foreach(filename IN LISTS files_removed) | |
| run_child( | |
| WORKING_DIRECTORY ${TOP}/user-source | |
| COMMAND ${P4CMD} delete ${TOP}/user-source/${filename} | |
| ) | |
| endforeach() | |
| #----------------------------------------------------------------------------- | |
| # Commit the changes to the repository. | |
| message("Committing revision 2...") | |
| run_child( | |
| WORKING_DIRECTORY ${TOP}/user-source | |
| COMMAND ${P4CMD} submit -d "CTEST: Changed content" | |
| ) | |
| #----------------------------------------------------------------------------- | |
| # Make changes in the working tree. | |
| message("Changing content again...") | |
| run_child( | |
| WORKING_DIRECTORY ${TOP}/user-source | |
| COMMAND ${P4CMD} edit //ctest/... | |
| ) | |
| change_content(user-source) | |
| run_child( | |
| WORKING_DIRECTORY ${TOP}/user-source | |
| COMMAND ${P4CMD} revert -a //ctest/... | |
| ) | |
| #----------------------------------------------------------------------------- | |
| # Commit the changes to the repository. | |
| message("Committing revision 3...") | |
| run_child( | |
| WORKING_DIRECTORY ${TOP}/user-source | |
| COMMAND ${P4CMD} submit -d "CTEST: Changed content again" | |
| ) | |
| #----------------------------------------------------------------------------- | |
| # Go back to before the changes so we can test updating. | |
| message("Backing up to revision 1...") | |
| run_child( | |
| WORKING_DIRECTORY ${TOP}/user-source | |
| COMMAND ${P4CMD} sync @r1 | |
| ) | |
| # Create a modified file. | |
| run_child( | |
| WORKING_DIRECTORY ${TOP}/user-source | |
| COMMAND ${P4CMD} sync @r1 | |
| ) | |
| # We should p4 open any files that modify_content creates | |
| run_child( | |
| WORKING_DIRECTORY ${TOP}/user-source | |
| COMMAND ${P4CMD} open ${TOP}/user-source/CTestConfig.cmake | |
| ) | |
| modify_content(user-source) | |
| #----------------------------------------------------------------------------- | |
| # Test updating the user work directory with the command-line interface. | |
| message("Running CTest Dashboard Command Line...") | |
| # Create the user build tree. | |
| create_build_tree(user-source user-binary) | |
| file(APPEND ${TOP}/user-binary/CTestConfiguration.ini | |
| "# P4 command configuration | |
| UpdateCommand: ${P4} | |
| P4Client: ctest_p4 | |
| P4Options: -H ${P4_HOST} -p ${P4_PORT} | |
| ") | |
| # Run the dashboard command line interface. | |
| run_dashboard_command_line(user-binary) | |
| # Revert the modified files | |
| run_child( | |
| WORKING_DIRECTORY ${TOP}/user-source | |
| COMMAND ${P4CMD} revert ${TOP}/user-source/CTestConfig.cmake | |
| ) | |
| #----------------------------------------------------------------------------- | |
| # Test initial checkout and update with a dashboard script. | |
| # Create a new client so we can check out files on a different directory | |
| message("Running CTest Dashboard Script...") | |
| message("Creating client spec...") | |
| file(WRITE ${TOP}/client2.spec "Client: ctest2_p4\n") | |
| file(APPEND ${TOP}/client2.spec "Root: ${TOP}/dash-source\n") | |
| file(APPEND ${TOP}/client2.spec "View: //ctest/... //ctest2_p4/...\n") | |
| run_child( | |
| COMMAND ${P4CMD} client -i | |
| INPUT_FILE ${TOP}/client2.spec | |
| ) | |
| file(MAKE_DIRECTORY ${TOP}/dash-source) | |
| create_dashboard_script(dash-binary | |
| "# P4 command configuration | |
| set(CTEST_P4_CLIENT \"ctest2_p4\") | |
| set(CTEST_P4_OPTIONS \"-H ${P4_HOST} -p ${P4_PORT}\") | |
| set(CTEST_UPDATE_COMMAND \"${P4}\") | |
| ") | |
| # Run the dashboard script with CTest. | |
| run_dashboard_script(dash-binary) | |
| #----------------------------------------------------------------------------- | |
| # Clean up | |
| message("Shutting down p4d") | |
| run_child( | |
| WORKING_DIRECTORY ${TOP} | |
| COMMAND ${P4CMD} admin stop | |
| ) |