| # 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 |
| ) |