CTestUpdateGIT.cmake.in 10.7 KB
Newer Older
1 2 3 4 5 6
# This script drives creation of a git 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)
7
string(APPEND TOP "/@CTestUpdateGIT_DIR@")
8
set(UPDATE_EXTRA Updated{module})
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

# Include code common to all update tests.
include("@CMAKE_CURRENT_SOURCE_DIR@/CTestUpdateCommon.cmake")

#-----------------------------------------------------------------------------
# Report git tools in use.
message("Using GIT tools:")
set(GIT "@GIT_EXECUTABLE@")
message(" git = ${GIT}")

set(AUTHOR_CONFIG "[user]
\tname = Test Author
\temail = testauthor@cmake.org
")

#-----------------------------------------------------------------------------
# Initialize the testing directory.
message("Creating test directory...")
init_testing()

29 30 31 32 33 34
if(UNIX)
  set(src "@CMAKE_CURRENT_SOURCE_DIR@")
  configure_file(${src}/CTestUpdateGIT.sh.in ${TOP}/git.sh @ONLY)
  set(GIT ${TOP}/git.sh)
endif()

35 36 37 38 39 40
#-----------------------------------------------------------------------------
# Create the repository.
message("Creating repository...")
file(MAKE_DIRECTORY ${TOP}/repo.git)
run_child(
  WORKING_DIRECTORY ${TOP}/repo.git
41
  COMMAND ${GIT} --bare init
42 43 44
  )
file(REMOVE_RECURSE ${TOP}/repo.git/hooks)

45 46 47 48 49 50 51 52
# Create submodule repository.
message("Creating submodule...")
file(MAKE_DIRECTORY ${TOP}/module.git)
run_child(
  WORKING_DIRECTORY ${TOP}/module.git
  COMMAND ${GIT} --bare init
  )
file(REMOVE_RECURSE ${TOP}/module.git/hooks)
53 54
run_child(WORKING_DIRECTORY ${TOP}
  COMMAND ${GIT} clone module.git module
55 56 57 58
  )
file(REMOVE_RECURSE ${TOP}/module/.git/hooks)
file(APPEND ${TOP}/module/.git/config "
${AUTHOR_CONFIG}")
59
create_content(module)
60 61 62 63 64 65 66 67 68 69
run_child(WORKING_DIRECTORY ${TOP}/module
  COMMAND ${GIT} add .
  )
run_child(WORKING_DIRECTORY ${TOP}/module
  COMMAND ${GIT} commit -m "Initial content"
  )
run_child(WORKING_DIRECTORY ${TOP}/module
  COMMAND ${GIT} push origin master:refs/heads/master
  )

70 71 72 73 74
#-----------------------------------------------------------------------------
# Import initial content into the repository.
message("Importing content...")

# Import the content into the repository.
75 76
run_child(WORKING_DIRECTORY ${TOP}
  COMMAND ${GIT} clone repo.git import
77 78 79 80
  )
file(REMOVE_RECURSE ${TOP}/import/.git/hooks)
file(APPEND ${TOP}/import/.git/config "
${AUTHOR_CONFIG}")
81 82 83
create_content(import)
file(WRITE ${TOP}/import/HEAD "HEAD\n")
file(WRITE ${TOP}/import/master "master\n")
84 85 86
run_child(WORKING_DIRECTORY ${TOP}/import
  COMMAND ${GIT} add .
  )
87 88 89
run_child(WORKING_DIRECTORY ${TOP}/import
  COMMAND ${GIT} config core.safecrlf false
  )
90
run_child(WORKING_DIRECTORY ${TOP}/import
91
  COMMAND ${GIT} submodule add ../module.git module
92
  )
93 94 95 96 97 98 99
run_child(WORKING_DIRECTORY ${TOP}/import
  COMMAND ${GIT} commit -m "Initial content"
  )
run_child(WORKING_DIRECTORY ${TOP}/import
  COMMAND ${GIT} push origin master:refs/heads/master
  )

100 101 102 103 104 105 106 107 108 109 110 111 112
#-----------------------------------------------------------------------------
# Modify the submodule.
change_content(module)
run_child(WORKING_DIRECTORY ${TOP}/module
  COMMAND ${GIT} add -u
  )
run_child(WORKING_DIRECTORY ${TOP}/module
  COMMAND ${GIT} commit -m "Changed content"
  )
run_child(WORKING_DIRECTORY ${TOP}/module
  COMMAND ${GIT} push origin master:refs/heads/master
  )

113 114 115 116 117
#-----------------------------------------------------------------------------
# Create a working tree.
message("Checking out revision 1...")
run_child(
  WORKING_DIRECTORY ${TOP}
118
  COMMAND ${GIT} clone repo.git user-source
119 120 121
  )
file(REMOVE_RECURSE ${TOP}/user-source/.git/hooks)
file(APPEND ${TOP}/user-source/.git/config "${AUTHOR_CONFIG}")
122 123 124 125 126 127 128 129
run_child(
  WORKING_DIRECTORY ${TOP}/user-source
  COMMAND ${GIT} submodule init
  )
run_child(
  WORKING_DIRECTORY ${TOP}/user-source
  COMMAND ${GIT} submodule update
  )
130

131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
# Save the first revision name.
execute_process(
  WORKING_DIRECTORY ${TOP}/user-source
  COMMAND ${GIT} rev-parse HEAD
  OUTPUT_VARIABLE revision1
  OUTPUT_STRIP_TRAILING_WHITESPACE
  )

#-----------------------------------------------------------------------------
# Create an empty commit.
message("Creating empty commit...")
run_child(
  WORKING_DIRECTORY ${TOP}/user-source
  COMMAND ${GIT} commit --allow-empty -m "Empty commit"
  )

147 148 149 150 151 152 153
#-----------------------------------------------------------------------------
# Make changes in the working tree.
message("Changing content...")
update_content(user-source files_added files_removed dirs_added)
if(dirs_added)
  run_child(
    WORKING_DIRECTORY ${TOP}/user-source
154
    COMMAND ${GIT} add -- ${dirs_added}
155
    )
156
endif()
157 158
run_child(
  WORKING_DIRECTORY ${TOP}/user-source
159
  COMMAND ${GIT} add -- ${files_added}
160 161 162
  )
run_child(
  WORKING_DIRECTORY ${TOP}/user-source
163
  COMMAND ${GIT} rm -- ${files_removed}
164
  )
165
run_child(WORKING_DIRECTORY ${TOP}/user-source/module
166
  COMMAND ${GIT} checkout master --
167
  )
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
run_child(
  WORKING_DIRECTORY ${TOP}/user-source
  COMMAND ${GIT} add -u
  )

#-----------------------------------------------------------------------------
# Commit the changes to the repository.
message("Committing revision 2...")
run_child(
  WORKING_DIRECTORY ${TOP}/user-source
  COMMAND ${GIT} commit -m "Changed content"
  )
run_child(
  WORKING_DIRECTORY ${TOP}/user-source
  COMMAND ${GIT} push origin
  )

#-----------------------------------------------------------------------------
# Make changes in the working tree.
message("Changing content again...")
change_content(user-source)
run_child(
  WORKING_DIRECTORY ${TOP}/user-source
  COMMAND ${GIT} add -u
  )

#-----------------------------------------------------------------------------
# Commit the changes to the repository.
message("Committing revision 3...")
run_child(
  WORKING_DIRECTORY ${TOP}/user-source
  COMMAND ${GIT} commit -m "Changed content again"
  )
run_child(
  WORKING_DIRECTORY ${TOP}/user-source
  COMMAND ${GIT} push origin
  )

#-----------------------------------------------------------------------------
# Go back to before the changes so we can test updating.
208 209 210 211
macro(rewind_source src_dir)
  message("Backing up to revision 1...")
  run_child(
    WORKING_DIRECTORY ${TOP}/${src_dir}
212
    COMMAND ${GIT} reset --hard ${revision1}
213 214 215 216 217
    )
  run_child(
    WORKING_DIRECTORY ${TOP}/${src_dir}
    COMMAND ${GIT} submodule update
    )
218
endmacro()
219
rewind_source(user-source)
220

221 222 223 224 225 226 227
# Make sure pull does not try to rebase (which does not work with
# modified files) even if ~/.gitconfig sets "branch.master.rebase".
run_child(
  WORKING_DIRECTORY ${TOP}/user-source
  COMMAND ${GIT} config branch.master.rebase false
  )

228 229 230 231 232 233 234 235 236 237 238 239 240 241 242
# Create a modified file.
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
  "# GIT command configuration
UpdateCommand: ${GIT}
")

# Run the dashboard command line interface.
243
set(UPDATE_NO_MODIFIED 1)
244
run_dashboard_command_line(user-binary)
245
set(UPDATE_NO_MODIFIED 0)
246

247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262
rewind_source(user-source)
modify_content(user-source)

message("Running CTest Dashboard Command Line (custom update)...")

# Create the user build tree.
create_build_tree(user-source user-binary-custom)
file(APPEND ${TOP}/user-binary-custom/CTestConfiguration.ini
  "# GIT command configuration
UpdateCommand: ${GIT}
GITUpdateCustom: ${GIT};pull;origin;master
")

# Run the dashboard command line interface.
run_dashboard_command_line(user-binary-custom)

263 264 265 266
#-----------------------------------------------------------------------------
# Test initial checkout and update with a dashboard script.
message("Running CTest Dashboard Script...")

267
create_dashboard_script(dash-binary
268 269 270 271 272
  "# git command configuration
set(CTEST_GIT_COMMAND \"${GIT}\")
set(CTEST_GIT_UPDATE_OPTIONS)
execute_process(
  WORKING_DIRECTORY \"${TOP}\"
273
  COMMAND \"${GIT}\" clone repo.git dash-source
274
  )
275 276 277 278 279

# Test .git file.
file(RENAME \"${TOP}/dash-source/.git\" \"${TOP}/dash-source/repo.git\")
file(WRITE \"${TOP}/dash-source/.git\" \"gitdir: repo.git\n\")

280 281
execute_process(
  WORKING_DIRECTORY \"${TOP}/dash-source\"
282
  COMMAND \"${GIT}\" reset --hard ${revision1}
283
  )
284 285 286 287 288 289 290 291
execute_process(
  WORKING_DIRECTORY \"${TOP}/dash-source\"
  COMMAND \"${GIT}\" submodule init
  )
execute_process(
  WORKING_DIRECTORY \"${TOP}/dash-source\"
  COMMAND \"${GIT}\" submodule update
  )
292 293 294
")

# Run the dashboard script with CTest.
295
run_dashboard_script(dash-binary)
296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311

rewind_source(dash-source)

#-----------------------------------------------------------------------------
# Test custom update with a dashboard script.
message("Running CTest Dashboard Script (custom update)...")

create_dashboard_script(dash-binary-custom
  "# git command configuration
set(CTEST_GIT_COMMAND \"${GIT}\")
set(CTEST_GIT_UPDATE_OPTIONS)
set(CTEST_GIT_UPDATE_CUSTOM \${CTEST_GIT_COMMAND} pull origin master)
")

# Run the dashboard script with CTest.
run_dashboard_script(dash-binary-custom)
312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328


rewind_source(dash-source)

#-----------------------------------------------------------------------------
# Test no update with a dashboard script.
message("Running CTest Dashboard Script (No update)...")

create_dashboard_script(dash-binary-no-update
  "# git command configuration
set(CTEST_GIT_COMMAND \"${GIT}\")
set(CTEST_UPDATE_VERSION_ONLY TRUE)
")

# Run the dashboard script with CTest.
set(NO_UPDATE 1)
run_dashboard_script(dash-binary-no-update)
329
unset(NO_UPDATE)
330 331 332 333 334 335 336

rewind_source(dash-source)

#-----------------------------------------------------------------------------
# Test ctest_update(QUIET)
message("Running CTest Dashboard Script (update quietly)...")

337
set(ctest_update_args QUIET)
338 339 340 341 342 343
create_dashboard_script(dash-binary-quiet
  "# git command configuration
set(CTEST_GIT_COMMAND \"${GIT}\")
set(CTEST_GIT_UPDATE_OPTIONS)
set(CTEST_GIT_UPDATE_CUSTOM \${CTEST_GIT_COMMAND} pull origin master)
")
344
unset(ctest_update_args)
345 346 347 348 349 350 351 352

# Run the dashboard script with CTest.
run_dashboard_script(dash-binary-quiet)

# Make sure the output seems quiet.
if("${OUTPUT}" MATCHES "Updating the repository")
  message(FATAL_ERROR "Found 'Updating the repository' in quiet output")
endif()
353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372

#-----------------------------------------------------------------------------
# Test ctest_update(RETURN_VALUE) on failure
message("Running CTest Dashboard Script (fail to update)...")

set(ctest_update_check [[

if(NOT ret LESS 0)
  message(FATAL_ERROR "ctest_update incorrectly succeeded with ${ret}")
endif()
]])
create_dashboard_script(dash-binary-fail
  "set(CTEST_GIT_COMMAND \"update-command-does-not-exist\")
")
unset(ctest_update_check)

# Run the dashboard script with CTest.
set(FAIL_UPDATE 1)
run_dashboard_script(dash-binary-fail)
unset(FAIL_UPDATE)