# 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.' " ) 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 ${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 ${files_added}) message("add: ${filename}") run_child( WORKING_DIRECTORY ${TOP}/user-source COMMAND ${P4CMD} add ${TOP}/user-source/${filename} ) endforeach() foreach(filename ${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 )