code: public void checkout(@Nonnull Run<?,?> build, @Nonnull Launcher launcher, @Nonnull FilePath workspace, @Nonnull TaskListener listener, @CheckForNull File changelogFile, @CheckForNull SCMRevisionState baseline) throws IOException, InterruptedException {
          if (build instanceof AbstractBuild && listener instanceof BuildListener && Util.isOverridden(SCM.class, getClass(), "checkout", AbstractBuild.class, Launcher.class, FilePath.class, BuildListener.class, File.class)) {
              if (changelogFile == null) {
                  changelogFile = File.createTempFile("changelog", ".xml");
                  try {
                      if (!checkout((AbstractBuild) build, launcher, workspace, (BuildListener) listener, changelogFile)) {
                          throw new AbortException();
                      }
                  } finally {
                      Util.deleteFile(changelogFile);
                  }
              } else {
                  if (!checkout((AbstractBuild) build, launcher, workspace, (BuildListener) listener, changelogFile)) {
                      throw new AbortException();
                  }
              }
          } else {
              throw new AbstractMethodError("you must override the new overload of checkout");
          }
      }
docs: Obtains a fresh workspace of the module(s) into the specified directory
  of the specified machine.
  
  <p>
  The "update" operation can be performed instead of a fresh checkout if
  feasible.
  
  <p>
  This operation should also capture the information necessary to tag the workspace later.
  
  @param launcher
  Abstracts away the machine that the files will be checked out.
  @param workspace
  a directory to check out the source code. May contain left-over
  from the previous build.
  @param changelogFile
  Upon a successful return, this file should capture the changelog.
  When there's no change, this file should contain an empty entry.
  See {@link #createEmptyChangeLog(File, TaskListener, String)}.
  May be null, in which case no changelog was requested.
  @param  baseline version from the previous build to use for changelog creation, if requested and available
  @throws InterruptedException
  interruption is usually caused by the user aborting the build.
  this exception will cause the build to be aborted.
  @throws AbortException in case of a routine failure
  @since 1.568