This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "CMake".

The branch, master has been updated
       via  1811f2b3716e4067d8ce1a230948999d7d5b343d (commit)
       via  e7d7cd47ed85678f29c18d63ef723f1a923d5742 (commit)
       via  7d89c5bf77ab00273d30a7e88a9ea85d55e34854 (commit)
       via  f5a7ae0c4bcfa90fb530d69f9277290c5f947db2 (commit)
       via  4c8741eb86c6a22298e815c4e34d3ccc0fffe1f4 (commit)
       via  197c5e12adea2b7d72cf8bfa17e961b9428f5d57 (commit)
       via  170fcd715f586cfd6b9f741c0572d472e0abe8ed (commit)
       via  207926795971d260d602390fbd70e3cb78b4deb3 (commit)
       via  2a71a0390c6c1130c9b50f717a751dc815310073 (commit)
      from  4892f73d7428fbbe4bd11d4892590ec81eeff56b (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=1811f2b3716e4067d8ce1a230948999d7d5b343d
commit 1811f2b3716e4067d8ce1a230948999d7d5b343d
Merge: e7d7cd4 4c8741e
Author:     Brad King <brad.k...@kitware.com>
AuthorDate: Mon Aug 26 14:33:53 2019 +0000
Commit:     Kitware Robot <kwro...@kitware.com>
CommitDate: Mon Aug 26 10:37:18 2019 -0400

    Merge topic 'cpack-stgz-license-prompt'
    
    4c8741eb86 CPack/STGZ: Require explicit acceptance or refusal of license
    
    Acked-by: Kitware Robot <kwro...@kitware.com>
    Merge-request: !3717


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=e7d7cd47ed85678f29c18d63ef723f1a923d5742
commit e7d7cd47ed85678f29c18d63ef723f1a923d5742
Merge: 7d89c5b 2a71a03
Author:     Brad King <brad.k...@kitware.com>
AuthorDate: Mon Aug 26 14:33:16 2019 +0000
Commit:     Kitware Robot <kwro...@kitware.com>
CommitDate: Mon Aug 26 10:34:55 2019 -0400

    Merge topic 'group_not_track'
    
    2a71a0390c ctest: rename TRACK to GROUP
    
    Acked-by: Kitware Robot <kwro...@kitware.com>
    Acked-by: Zack Galbreath <zack.galbre...@kitware.com>
    Merge-request: !3707


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=7d89c5bf77ab00273d30a7e88a9ea85d55e34854
commit 7d89c5bf77ab00273d30a7e88a9ea85d55e34854
Merge: f5a7ae0 2079267
Author:     Brad King <brad.k...@kitware.com>
AuthorDate: Mon Aug 26 14:32:37 2019 +0000
Commit:     Kitware Robot <kwro...@kitware.com>
CommitDate: Mon Aug 26 10:33:08 2019 -0400

    Merge topic 'warnings_skip_color'
    
    2079267959 ctest_build: ignore ANSI color
    
    Acked-by: Kitware Robot <kwro...@kitware.com>
    Merge-request: !3702


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=f5a7ae0c4bcfa90fb530d69f9277290c5f947db2
commit f5a7ae0c4bcfa90fb530d69f9277290c5f947db2
Merge: 4892f73 197c5e1
Author:     Brad King <brad.k...@kitware.com>
AuthorDate: Mon Aug 26 14:30:58 2019 +0000
Commit:     Kitware Robot <kwro...@kitware.com>
CommitDate: Mon Aug 26 10:31:15 2019 -0400

    Merge topic 'optional'
    
    197c5e12ad Source: Add cm::optional
    170fcd715f Extend C++17 feature checks to require std::optional
    
    Acked-by: Kitware Robot <kwro...@kitware.com>
    Acked-by: Sebastian Holtermann <sebh...@web.de>
    Merge-request: !3644


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=4c8741eb86c6a22298e815c4e34d3ccc0fffe1f4
commit 4c8741eb86c6a22298e815c4e34d3ccc0fffe1f4
Author:     sidju <acco...@sidju.se>
AuthorDate: Fri Aug 23 05:15:27 2019 -0400
Commit:     Brad King <brad.k...@kitware.com>
CommitDate: Fri Aug 23 11:04:26 2019 -0400

    CPack/STGZ: Require explicit acceptance or refusal of license
    
    To make using the generated STGZ easier, require a specific answer to
    accepting the license terms.  Since more moves down one line when '\n'
    is entered a user may hold enter to paginate through the document. This
    change prevents the user from accidentally refusing the license terms by
    holding enter for too long and having to start over.

diff --git a/Modules/Internal/CPack/CPack.STGZ_Header.sh.in 
b/Modules/Internal/CPack/CPack.STGZ_Header.sh.in
index 003fcfe..a857aa5 100755
--- a/Modules/Internal/CPack/CPack.STGZ_Header.sh.in
+++ b/Modules/Internal/CPack/CPack.STGZ_Header.sh.in
@@ -86,15 +86,19 @@ then
 @CPACK_RESOURCE_FILE_LICENSE_CONTENT@
 ____cpack__here_doc____
     echo
-    echo "Do you accept the license? [yN]: "
-    read line leftover
-    case ${line} in
-      y* | Y*)
-        cpack_license_accepted=TRUE;;
-      *)
-        echo "License not accepted. Exiting ..."
-        exit 1;;
-    esac
+    while true
+      do
+        echo "Do you accept the license? [yn]: "
+        read line leftover
+        case ${line} in
+          y* | Y*)
+            cpack_license_accepted=TRUE
+            break;;
+          n* | N* | q* | Q* | e* | E*)
+            echo "License not accepted. Exiting ..."
+            exit 1;;
+        esac
+      done
   fi
 
   if [ "x${cpack_include_subdir}x" = "xx" ]

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=197c5e12adea2b7d72cf8bfa17e961b9428f5d57
commit 197c5e12adea2b7d72cf8bfa17e961b9428f5d57
Author:     Kyle Edwards <kyle.edwa...@kitware.com>
AuthorDate: Fri Aug 2 16:52:19 2019 -0400
Commit:     Brad King <brad.k...@kitware.com>
CommitDate: Fri Aug 23 08:43:35 2019 -0400

    Source: Add cm::optional

diff --git a/Source/cm_optional.hxx b/Source/cm_optional.hxx
new file mode 100644
index 0000000..295571d
--- /dev/null
+++ b/Source/cm_optional.hxx
@@ -0,0 +1,343 @@
+/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
+   file Copyright.txt or https://cmake.org/licensing for details.  */
+#ifndef cm_optional_hxx
+#define cm_optional_hxx
+
+#include "cmConfigure.h" // IWYU pragma: keep
+
+#if __cplusplus >= 201703L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)
+#  define CMake_HAVE_CXX_OPTIONAL
+#endif
+
+#if defined(CMake_HAVE_CXX_OPTIONAL)
+#  include <optional>
+#else
+#  include "cm_utility.hxx"
+#  include <memory>
+#  include <utility>
+#endif
+
+namespace cm {
+
+#if defined(CMake_HAVE_CXX_OPTIONAL)
+
+using std::nullopt_t;
+using std::nullopt;
+using std::optional;
+using std::bad_optional_access;
+using std::make_optional;
+
+#else
+
+class bad_optional_access : public std::exception
+{
+  using std::exception::exception;
+};
+
+struct nullopt_t
+{
+  explicit constexpr nullopt_t(int) {}
+};
+
+constexpr nullopt_t nullopt{ 0 };
+
+template <typename T>
+class optional
+{
+public:
+  using value_type = T;
+
+  optional() noexcept = default;
+  optional(nullopt_t) noexcept;
+  optional(const optional& other);
+  optional(optional&& other) noexcept;
+
+  template <typename... Args>
+  explicit optional(cm::in_place_t, Args&&... args);
+
+  template <
+    typename U = T,
+    typename = typename std::enable_if<
+      std::is_constructible<T, U&&>::value &&
+      !std::is_same<typename std::decay<U>::type, cm::in_place_t>::value &&
+      !std::is_same<typename std::decay<U>::type,
+                    cm::optional<T>>::value>::type>
+  optional(U&& v);
+
+  ~optional();
+
+  optional& operator=(nullopt_t) noexcept;
+  optional& operator=(const optional& other);
+  optional& operator=(optional&& other) noexcept;
+
+  template <
+    typename U = T,
+    typename = typename std::enable_if<
+      !std::is_same<typename std::decay<U>::type, cm::optional<T>>::value &&
+      std::is_constructible<T, U>::value && std::is_assignable<T&, U>::value &&
+      (!std::is_scalar<T>::value ||
+       !std::is_same<typename std::decay<U>::type, T>::value)>::type>
+  optional& operator=(U&& v);
+
+  const T* operator->() const;
+  T* operator->();
+  const T& operator*() const&;
+  T& operator*() &;
+  const T&& operator*() const&&;
+  T&& operator*() &&;
+
+  explicit operator bool() const noexcept;
+  bool has_value() const noexcept;
+
+  T& value() &;
+  const T& value() const&;
+
+  T&& value() &&;
+  const T&& value() const&&;
+
+  template <typename U>
+  T value_or(U&& default_value) const&;
+
+  template <typename U>
+  T value_or(U&& default_value) &&;
+
+  void swap(optional& other) noexcept;
+  void reset() noexcept;
+
+  template <typename... Args>
+  T& emplace(Args&&... args);
+
+private:
+  bool _has_value = false;
+  std::allocator<T> _allocator;
+  union _mem_union
+  {
+    T value;
+
+    // Explicit constructor and destructor is required to make this work
+    _mem_union() noexcept {}
+    ~_mem_union() noexcept {}
+  } _mem;
+};
+
+template <typename T>
+optional<typename std::decay<T>::type> make_optional(T&& value)
+{
+  return optional<typename std::decay<T>::type>(std::forward<T>(value));
+}
+
+template <typename T, class... Args>
+optional<T> make_optional(Args&&... args)
+{
+  return optional<T>(in_place, std::forward<Args>(args)...);
+}
+
+template <typename T>
+optional<T>::optional(nullopt_t) noexcept
+{
+}
+
+template <typename T>
+optional<T>::optional(const optional& other)
+{
+  *this = other;
+}
+
+template <typename T>
+optional<T>::optional(optional&& other) noexcept
+{
+  *this = std::move(other);
+}
+
+template <typename T>
+template <typename... Args>
+optional<T>::optional(cm::in_place_t, Args&&... args)
+{
+  this->emplace(std::forward<Args>(args)...);
+}
+
+template <typename T>
+template <typename U, typename>
+optional<T>::optional(U&& v)
+{
+  this->emplace(std::forward<U>(v));
+}
+
+template <typename T>
+optional<T>::~optional()
+{
+  this->reset();
+}
+
+template <typename T>
+optional<T>& optional<T>::operator=(nullopt_t) noexcept
+{
+  this->reset();
+  return *this;
+}
+
+template <typename T>
+optional<T>& optional<T>::operator=(const optional& other)
+{
+  if (other.has_value()) {
+    if (this->has_value()) {
+      this->value() = *other;
+    } else {
+      this->emplace(*other);
+    }
+  } else {
+    this->reset();
+  }
+  return *this;
+}
+
+template <typename T>
+optional<T>& optional<T>::operator=(optional&& other) noexcept
+{
+  if (other.has_value()) {
+    if (this->has_value()) {
+      this->value() = std::move(*other);
+    } else {
+      this->emplace(std::move(*other));
+    }
+  } else {
+    this->reset();
+  }
+  return *this;
+}
+
+template <typename T>
+template <typename U, typename>
+optional<T>& optional<T>::operator=(U&& v)
+{
+  if (this->has_value()) {
+    this->value() = v;
+  } else {
+    this->emplace(std::forward<U>(v));
+  }
+  return *this;
+}
+
+template <typename T>
+const T* optional<T>::operator->() const
+{
+  return &**this;
+}
+
+template <typename T>
+T* optional<T>::operator->()
+{
+  return &**this;
+}
+
+template <typename T>
+const T& optional<T>::operator*() const&
+{
+  return this->_mem.value;
+}
+
+template <typename T>
+T& optional<T>::operator*() &
+{
+  return this->_mem.value;
+}
+
+template <typename T>
+const T&& optional<T>::operator*() const&&
+{
+  return std::move(**this);
+}
+
+template <typename T>
+T&& optional<T>::operator*() &&
+{
+  return std::move(**this);
+}
+
+template <typename T>
+bool optional<T>::has_value() const noexcept
+{
+  return this->_has_value;
+}
+
+template <typename T>
+optional<T>::operator bool() const noexcept
+{
+  return this->has_value();
+}
+
+template <typename T>
+T& optional<T>::value() &
+{
+  if (!this->has_value()) {
+    throw cm::bad_optional_access{};
+  }
+  return **this;
+}
+
+template <typename T>
+const T& optional<T>::value() const&
+{
+  if (!this->has_value()) {
+    throw cm::bad_optional_access{};
+  }
+  return **this;
+}
+
+template <typename T>
+template <typename U>
+T optional<T>::value_or(U&& default_value) const&
+{
+  return bool(*this) ? **this : static_cast<T>(std::forward<U>(default_value));
+}
+
+template <typename T>
+template <typename U>
+T optional<T>::value_or(U&& default_value) &&
+{
+  return bool(*this) ? std::move(**this)
+                     : static_cast<T>(std::forward<U>(default_value));
+}
+
+template <typename T>
+void optional<T>::swap(optional& other) noexcept
+{
+  if (this->has_value()) {
+    if (other.has_value()) {
+      using std::swap;
+      swap(**this, *other);
+    } else {
+      other.emplace(std::move(**this));
+      this->reset();
+    }
+  } else if (other.has_value()) {
+    this->emplace(std::move(*other));
+    other.reset();
+  }
+}
+
+template <typename T>
+void optional<T>::reset() noexcept
+{
+  if (this->has_value()) {
+    this->_has_value = false;
+    std::allocator_traits<std::allocator<T>>::destroy(this->_allocator,
+                                                      &**this);
+  }
+}
+
+template <typename T>
+template <typename... Args>
+T& optional<T>::emplace(Args&&... args)
+{
+  this->reset();
+  std::allocator_traits<std::allocator<T>>::construct(
+    this->_allocator, &**this, std::forward<Args>(args)...);
+  this->_has_value = true;
+  return this->value();
+}
+
+#endif
+}
+
+#endif
diff --git a/Source/cm_utility.hxx b/Source/cm_utility.hxx
new file mode 100644
index 0000000..99d7f8b
--- /dev/null
+++ b/Source/cm_utility.hxx
@@ -0,0 +1,35 @@
+/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
+   file Copyright.txt or https://cmake.org/licensing for details.  */
+#ifndef cm_utility_hxx
+#define cm_utility_hxx
+
+#include "cmConfigure.h" // IWYU pragma: keep
+
+#if __cplusplus >= 201703L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)
+#  define CMake_HAVE_CXX_IN_PLACE
+#endif
+
+#if defined(CMake_HAVE_CXX_IN_PLACE)
+#  include <utility>
+#endif
+
+namespace cm {
+
+#if defined(CMake_HAVE_CXX_IN_PLACE)
+
+using std::in_place_t;
+using std::in_place;
+
+#else
+
+struct in_place_t
+{
+  explicit in_place_t() = default;
+};
+
+constexpr in_place_t in_place{};
+
+#endif
+}
+
+#endif
diff --git a/Tests/CMakeLib/CMakeLists.txt b/Tests/CMakeLib/CMakeLists.txt
index cd4dbc8..204810e 100644
--- a/Tests/CMakeLib/CMakeLists.txt
+++ b/Tests/CMakeLib/CMakeLists.txt
@@ -9,6 +9,7 @@ set(CMakeLib_TESTS
   testGeneratedFileStream.cxx
   testRST.cxx
   testRange.cxx
+  testOptional.cxx
   testString.cxx
   testStringAlgorithms.cxx
   testSystemTools.cxx
diff --git a/Tests/CMakeLib/testOptional.cxx b/Tests/CMakeLib/testOptional.cxx
new file mode 100644
index 0000000..a5e30fb
--- /dev/null
+++ b/Tests/CMakeLib/testOptional.cxx
@@ -0,0 +1,690 @@
+#include "cm_optional.hxx"
+#include "cm_utility.hxx"
+
+#include <iostream>
+#include <type_traits>
+#include <utility>
+#include <vector>
+
+class EventLogger;
+
+class Event
+{
+public:
+  enum EventType
+  {
+    DEFAULT_CONSTRUCT,
+    COPY_CONSTRUCT,
+    MOVE_CONSTRUCT,
+    VALUE_CONSTRUCT,
+
+    DESTRUCT,
+
+    COPY_ASSIGN,
+    MOVE_ASSIGN,
+    VALUE_ASSIGN,
+
+    REFERENCE,
+    CONST_REFERENCE,
+    RVALUE_REFERENCE,
+    CONST_RVALUE_REFERENCE,
+
+    SWAP,
+  };
+
+  EventType Type;
+  const EventLogger* Logger1;
+  const EventLogger* Logger2;
+  int Value;
+
+  bool operator==(const Event& other) const;
+  bool operator!=(const Event& other) const;
+};
+
+bool Event::operator==(const Event& other) const
+{
+  return this->Type == other.Type && this->Logger1 == other.Logger1 &&
+    this->Logger2 == other.Logger2 && this->Value == other.Value;
+}
+
+bool Event::operator!=(const Event& other) const
+{
+  return !(*this == other);
+}
+
+static std::vector<Event> events;
+
+class EventLogger
+{
+public:
+  EventLogger();
+  EventLogger(const EventLogger& other);
+  EventLogger(EventLogger&& other);
+  EventLogger(int value);
+
+  ~EventLogger();
+
+  EventLogger& operator=(const EventLogger& other);
+  EventLogger& operator=(EventLogger&& other);
+  EventLogger& operator=(int value);
+
+  void Reference() &;
+  void Reference() const&;
+  void Reference() &&;
+  void Reference() const&&;
+
+  int Value = 0;
+};
+
+// Certain builds of GCC generate false -Wmaybe-uninitialized warnings when
+// doing a release build with the system version of std::optional. These
+// warnings do not manifest when using our own cm::optional implementation.
+// Silence these false warnings.
+#if defined(__GNUC__) && !defined(__clang__)
+#  define BEGIN_IGNORE_UNINITIALIZED                                          \
+    _Pragma("GCC diagnostic push")                                            \
+      _Pragma("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
+#  define END_IGNORE_UNINITIALIZED _Pragma("GCC diagnostic pop")
+#else
+#  define BEGIN_IGNORE_UNINITIALIZED
+#  define END_IGNORE_UNINITIALIZED
+#endif
+
+void swap(EventLogger& e1, EventLogger& e2)
+{
+  BEGIN_IGNORE_UNINITIALIZED
+  events.push_back({ Event::SWAP, &e1, &e2, e2.Value });
+  END_IGNORE_UNINITIALIZED
+  auto tmp = e1.Value;
+  e1.Value = e2.Value;
+  e2.Value = tmp;
+}
+
+EventLogger::EventLogger()
+  : Value(0)
+{
+  events.push_back({ Event::DEFAULT_CONSTRUCT, this, nullptr, 0 });
+}
+
+EventLogger::EventLogger(const EventLogger& other)
+  : Value(other.Value)
+{
+  events.push_back({ Event::COPY_CONSTRUCT, this, &other, other.Value });
+}
+
+BEGIN_IGNORE_UNINITIALIZED
+EventLogger::EventLogger(EventLogger&& other)
+  : Value(other.Value)
+{
+  events.push_back({ Event::MOVE_CONSTRUCT, this, &other, other.Value });
+}
+END_IGNORE_UNINITIALIZED
+
+EventLogger::EventLogger(int value)
+  : Value(value)
+{
+  events.push_back({ Event::VALUE_CONSTRUCT, this, nullptr, value });
+}
+
+EventLogger::~EventLogger()
+{
+  BEGIN_IGNORE_UNINITIALIZED
+  events.push_back({ Event::DESTRUCT, this, nullptr, this->Value });
+  END_IGNORE_UNINITIALIZED
+}
+
+EventLogger& EventLogger::operator=(const EventLogger& other)
+{
+  events.push_back({ Event::COPY_ASSIGN, this, &other, other.Value });
+  this->Value = other.Value;
+  return *this;
+}
+
+EventLogger& EventLogger::operator=(EventLogger&& other)
+{
+  events.push_back({ Event::MOVE_ASSIGN, this, &other, other.Value });
+  this->Value = other.Value;
+  return *this;
+}
+
+EventLogger& EventLogger::operator=(int value)
+{
+  events.push_back({ Event::VALUE_ASSIGN, this, nullptr, value });
+  this->Value = value;
+  return *this;
+}
+
+void EventLogger::Reference() &
+{
+  events.push_back({ Event::REFERENCE, this, nullptr, this->Value });
+}
+
+void EventLogger::Reference() const&
+{
+  events.push_back({ Event::CONST_REFERENCE, this, nullptr, this->Value });
+}
+
+void EventLogger::Reference() &&
+{
+  events.push_back({ Event::RVALUE_REFERENCE, this, nullptr, this->Value });
+}
+
+void EventLogger::Reference() const&&
+{
+  events.push_back(
+    { Event::CONST_RVALUE_REFERENCE, this, nullptr, this->Value });
+}
+
+static bool testDefaultConstruct(std::vector<Event>& expected)
+{
+  const cm::optional<EventLogger> o{};
+
+  expected = {};
+  return true;
+}
+
+static bool testNulloptConstruct(std::vector<Event>& expected)
+{
+  const cm::optional<EventLogger> o{ cm::nullopt };
+
+  expected = {};
+  return true;
+}
+
+static bool testValueConstruct(std::vector<Event>& expected)
+{
+  const cm::optional<EventLogger> o{ 4 };
+
+  expected = {
+    { Event::VALUE_CONSTRUCT, &*o, nullptr, 4 },
+    { Event::DESTRUCT, &*o, nullptr, 4 },
+  };
+  return true;
+}
+
+static bool testInPlaceConstruct(std::vector<Event>& expected)
+{
+  const cm::optional<EventLogger> o1{ cm::in_place, 4 };
+  const cm::optional<EventLogger> o2{ cm::in_place_t{}, 4 };
+
+  expected = {
+    { Event::VALUE_CONSTRUCT, &*o1, nullptr, 4 },
+    { Event::VALUE_CONSTRUCT, &*o2, nullptr, 4 },
+    { Event::DESTRUCT, &*o2, nullptr, 4 },
+    { Event::DESTRUCT, &*o1, nullptr, 4 },
+  };
+  return true;
+}
+
+static bool testCopyConstruct(std::vector<Event>& expected)
+{
+  const cm::optional<EventLogger> o1{ 4 };
+  const cm::optional<EventLogger> o2{ o1 };
+  const cm::optional<EventLogger> o3{};
+  const cm::optional<EventLogger> o4{ o3 };
+
+  expected = {
+    { Event::VALUE_CONSTRUCT, &*o1, nullptr, 4 },
+    { Event::COPY_CONSTRUCT, &*o2, &o1.value(), 4 },
+    { Event::DESTRUCT, &*o2, nullptr, 4 },
+    { Event::DESTRUCT, &*o1, nullptr, 4 },
+  };
+  return true;
+}
+
+static bool testMoveConstruct(std::vector<Event>& expected)
+{
+  cm::optional<EventLogger> o1{ 4 };
+  const cm::optional<EventLogger> o2{ std::move(o1) };
+  cm::optional<EventLogger> o3{};
+  const cm::optional<EventLogger> o4{ std::move(o3) };
+
+  expected = {
+    { Event::VALUE_CONSTRUCT, &*o1, nullptr, 4 },
+    { Event::MOVE_CONSTRUCT, &*o2, &o1.value(), 4 },
+    { Event::DESTRUCT, &*o2, nullptr, 4 },
+    { Event::DESTRUCT, &*o1, nullptr, 4 },
+  };
+  return true;
+}
+
+static bool testNulloptAssign(std::vector<Event>& expected)
+{
+  cm::optional<EventLogger> o1{ 4 };
+  o1 = cm::nullopt;
+  cm::optional<EventLogger> o2{};
+  o2 = cm::nullopt;
+
+  expected = {
+    { Event::VALUE_CONSTRUCT, &*o1, nullptr, 4 },
+    { Event::DESTRUCT, &*o1, nullptr, 4 },
+  };
+  return true;
+}
+
+static bool testCopyAssign(std::vector<Event>& expected)
+{
+  cm::optional<EventLogger> o1{};
+  const cm::optional<EventLogger> o2{ 4 };
+  o1 = o2;
+  const cm::optional<EventLogger> o3{ 5 };
+  o1 = o3;
+  const cm::optional<EventLogger> o4{};
+  o1 = o4;
+  o1 = o4; // Intentionally duplicated to test assigning an empty optional to
+  // an empty optional
+
+  expected = {
+    { Event::VALUE_CONSTRUCT, &*o2, nullptr, 4 },
+    { Event::COPY_CONSTRUCT, &*o1, &*o2, 4 },
+    { Event::VALUE_CONSTRUCT, &*o3, nullptr, 5 },
+    { Event::COPY_ASSIGN, &*o1, &*o3, 5 },
+    { Event::DESTRUCT, &*o1, nullptr, 5 },
+    { Event::DESTRUCT, &o3.value(), nullptr, 5 },
+    { Event::DESTRUCT, &o2.value(), nullptr, 4 },
+  };
+  return true;
+}
+
+static bool testMoveAssign(std::vector<Event>& expected)
+{
+  cm::optional<EventLogger> o1{};
+  cm::optional<EventLogger> o2{ 4 };
+  o1 = std::move(o2);
+  cm::optional<EventLogger> o3{ 5 };
+  o1 = std::move(o3);
+  cm::optional<EventLogger> o4{};
+  o1 = std::move(o4);
+
+  expected = {
+    { Event::VALUE_CONSTRUCT, &*o2, nullptr, 4 },
+    { Event::MOVE_CONSTRUCT, &*o1, &*o2, 4 },
+    { Event::VALUE_CONSTRUCT, &*o3, nullptr, 5 },
+    { Event::MOVE_ASSIGN, &*o1, &*o3, 5 },
+    { Event::DESTRUCT, &*o1, nullptr, 5 },
+    { Event::DESTRUCT, &*o3, nullptr, 5 },
+    { Event::DESTRUCT, &*o2, nullptr, 4 },
+  };
+  return true;
+}
+
+static bool testPointer(std::vector<Event>& expected)
+{
+  cm::optional<EventLogger> o1{ 4 };
+  const cm::optional<EventLogger> o2{ 5 };
+
+  o1->Reference();
+  o2->Reference();
+
+  expected = {
+    { Event::VALUE_CONSTRUCT, &*o1, nullptr, 4 },
+    { Event::VALUE_CONSTRUCT, &*o2, nullptr, 5 },
+    { Event::REFERENCE, &*o1, nullptr, 4 },
+    { Event::CONST_REFERENCE, &*o2, nullptr, 5 },
+    { Event::DESTRUCT, &*o2, nullptr, 5 },
+    { Event::DESTRUCT, &*o1, nullptr, 4 },
+  };
+  return true;
+}
+
+#if !__GNUC__ || __GNUC__ > 4
+#  define ALLOW_CONST_RVALUE
+#endif
+
+static bool testDereference(std::vector<Event>& expected)
+{
+  cm::optional<EventLogger> o1{ 4 };
+  const cm::optional<EventLogger> o2{ 5 };
+
+  (*o1).Reference();
+  (*o2).Reference();
+  (*std::move(o1)).Reference();
+#ifdef ALLOW_CONST_RVALUE
+  (*std::move(o2)).Reference(); // Broken in GCC 4.9.0. Sigh...
+#endif
+
+  expected = {
+    { Event::VALUE_CONSTRUCT, &*o1, nullptr, 4 },
+    { Event::VALUE_CONSTRUCT, &*o2, nullptr, 5 },
+    { Event::REFERENCE, &*o1, nullptr, 4 },
+    { Event::CONST_REFERENCE, &*o2, nullptr, 5 },
+    { Event::RVALUE_REFERENCE, &*o1, nullptr, 4 },
+#ifdef ALLOW_CONST_RVALUE
+    { Event::CONST_RVALUE_REFERENCE, &*o2, nullptr, 5 },
+#endif
+    { Event::DESTRUCT, &*o2, nullptr, 5 },
+    { Event::DESTRUCT, &*o1, nullptr, 4 },
+  };
+  return true;
+}
+
+static bool testHasValue(std::vector<Event>& expected)
+{
+  bool retval = true;
+
+  const cm::optional<EventLogger> o1{ 4 };
+  const cm::optional<EventLogger> o2{};
+
+  if (!o1.has_value()) {
+    std::cout << "o1 should have a value" << std::endl;
+    retval = false;
+  }
+
+  if (!o1) {
+    std::cout << "(bool)o1 should be true" << std::endl;
+    retval = false;
+  }
+
+  if (o2.has_value()) {
+    std::cout << "o2 should not have a value" << std::endl;
+    retval = false;
+  }
+
+  if (o2) {
+    std::cout << "(bool)o2 should be false" << std::endl;
+    retval = false;
+  }
+
+  expected = {
+    { Event::VALUE_CONSTRUCT, &*o1, nullptr, 4 },
+    { Event::DESTRUCT, &*o1, nullptr, 4 },
+  };
+  return retval;
+}
+
+static bool testValue(std::vector<Event>& expected)
+{
+  bool retval = true;
+
+  cm::optional<EventLogger> o1{ 4 };
+  const cm::optional<EventLogger> o2{ 5 };
+  cm::optional<EventLogger> o3{};
+  const cm::optional<EventLogger> o4{};
+
+  o1.value().Reference();
+  o2.value().Reference();
+
+  bool thrown = false;
+  try {
+    (void)o3.value();
+  } catch (cm::bad_optional_access&) {
+    thrown = true;
+  }
+  if (!thrown) {
+    std::cout << "o3.value() did not throw" << std::endl;
+    retval = false;
+  }
+
+  thrown = false;
+  try {
+    (void)o4.value();
+  } catch (cm::bad_optional_access&) {
+    thrown = true;
+  }
+  if (!thrown) {
+    std::cout << "o4.value() did not throw" << std::endl;
+    retval = false;
+  }
+
+  expected = {
+    { Event::VALUE_CONSTRUCT, &*o1, nullptr, 4 },
+    { Event::VALUE_CONSTRUCT, &*o2, nullptr, 5 },
+    { Event::REFERENCE, &*o1, nullptr, 4 },
+    { Event::CONST_REFERENCE, &*o2, nullptr, 5 },
+    { Event::DESTRUCT, &*o2, nullptr, 5 },
+    { Event::DESTRUCT, &*o1, nullptr, 4 },
+  };
+  return retval;
+}
+
+static bool testValueOr()
+{
+  bool retval = true;
+
+  const cm::optional<EventLogger> o1{ 4 };
+  cm::optional<EventLogger> o2{ 5 };
+  const cm::optional<EventLogger> o3{};
+  cm::optional<EventLogger> o4{};
+
+  EventLogger e1{ 6 };
+  EventLogger e2{ 7 };
+  EventLogger e3{ 8 };
+  EventLogger e4{ 9 };
+
+  EventLogger r1 = o1.value_or(e1);
+  if (r1.Value != 4) {
+    std::cout << "r1.Value should be 4" << std::endl;
+    retval = false;
+  }
+  EventLogger r2 = std::move(o2).value_or(e2);
+  if (r2.Value != 5) {
+    std::cout << "r2.Value should be 5" << std::endl;
+    retval = false;
+  }
+  EventLogger r3 = o3.value_or(e3);
+  if (r3.Value != 8) {
+    std::cout << "r3.Value should be 8" << std::endl;
+    retval = false;
+  }
+  EventLogger r4 = std::move(o4).value_or(e4);
+  if (r4.Value != 9) {
+    std::cout << "r4.Value should be 9" << std::endl;
+    retval = false;
+  }
+
+  return retval;
+}
+
+static bool testSwap(std::vector<Event>& expected)
+{
+  bool retval = true;
+
+  cm::optional<EventLogger> o1{ 4 };
+  cm::optional<EventLogger> o2{};
+
+  o1.swap(o2);
+
+  if (o1.has_value()) {
+    std::cout << "o1 should not have value" << std::endl;
+    retval = false;
+  }
+  if (!o2.has_value()) {
+    std::cout << "o2 should have value" << std::endl;
+    retval = false;
+  }
+  if (o2.value().Value != 4) {
+    std::cout << "value of o2 should be 4" << std::endl;
+    retval = false;
+  }
+
+  o1.swap(o2);
+
+  if (!o1.has_value()) {
+    std::cout << "o1 should have value" << std::endl;
+    retval = false;
+  }
+  if (o1.value().Value != 4) {
+    std::cout << "value of o1 should be 4" << std::endl;
+    retval = false;
+  }
+  if (o2.has_value()) {
+    std::cout << "o2 should not have value" << std::endl;
+    retval = false;
+  }
+
+  o2.emplace(5);
+  o1.swap(o2);
+
+  if (!o1.has_value()) {
+    std::cout << "o1 should have value" << std::endl;
+    retval = false;
+  }
+  if (o1.value().Value != 5) {
+    std::cout << "value of o1 should be 5" << std::endl;
+    retval = false;
+  }
+  if (!o2.has_value()) {
+    std::cout << "o2 should not have value" << std::endl;
+    retval = false;
+  }
+  if (o2.value().Value != 4) {
+    std::cout << "value of o2 should be 4" << std::endl;
+    retval = false;
+  }
+
+  o1.reset();
+  o2.reset();
+  o1.swap(o2);
+
+  if (o1.has_value()) {
+    std::cout << "o1 should not have value" << std::endl;
+    retval = false;
+  }
+  if (o2.has_value()) {
+    std::cout << "o2 should not have value" << std::endl;
+    retval = false;
+  }
+
+  expected = {
+    { Event::VALUE_CONSTRUCT, &*o1, nullptr, 4 },
+    { Event::MOVE_CONSTRUCT, &*o2, &*o1, 4 },
+    { Event::DESTRUCT, &*o1, nullptr, 4 },
+    { Event::MOVE_CONSTRUCT, &*o1, &*o2, 4 },
+    { Event::DESTRUCT, &*o2, nullptr, 4 },
+    { Event::VALUE_CONSTRUCT, &*o2, nullptr, 5 },
+    { Event::SWAP, &*o1, &*o2, 5 },
+    { Event::DESTRUCT, &*o1, nullptr, 5 },
+    { Event::DESTRUCT, &*o2, nullptr, 4 },
+  };
+  return retval;
+}
+
+static bool testReset(std::vector<Event>& expected)
+{
+  bool retval = true;
+
+  cm::optional<EventLogger> o{ 4 };
+
+  o.reset();
+
+  if (o.has_value()) {
+    std::cout << "o should not have value" << std::endl;
+    retval = false;
+  }
+
+  o.reset();
+
+  expected = {
+    { Event::VALUE_CONSTRUCT, &*o, nullptr, 4 },
+    { Event::DESTRUCT, &*o, nullptr, 4 },
+  };
+  return retval;
+}
+
+static bool testEmplace(std::vector<Event>& expected)
+{
+  cm::optional<EventLogger> o{ 4 };
+
+  o.emplace(5);
+  o.reset();
+  o.emplace();
+
+  expected = {
+    { Event::VALUE_CONSTRUCT, &*o, nullptr, 4 },
+    { Event::DESTRUCT, &*o, nullptr, 4 },
+    { Event::VALUE_CONSTRUCT, &*o, nullptr, 5 },
+    { Event::DESTRUCT, &*o, nullptr, 5 },
+    { Event::DEFAULT_CONSTRUCT, &*o, nullptr, 0 },
+    { Event::DESTRUCT, &*o, nullptr, 0 },
+  };
+  return true;
+}
+
+static bool testMakeOptional(std::vector<Event>& expected)
+{
+  EventLogger e{ 4 };
+  cm::optional<EventLogger> o1 = cm::make_optional<EventLogger>(e);
+  cm::optional<EventLogger> o2 = cm::make_optional<EventLogger>(5);
+
+  expected = {
+    { Event::VALUE_CONSTRUCT, &e, nullptr, 4 },
+    { Event::COPY_CONSTRUCT, &*o1, &e, 4 },
+    { Event::VALUE_CONSTRUCT, &*o2, nullptr, 5 },
+    { Event::DESTRUCT, &*o2, nullptr, 5 },
+    { Event::DESTRUCT, &*o1, nullptr, 4 },
+    { Event::DESTRUCT, &e, nullptr, 4 },
+  };
+  return true;
+}
+
+static bool testMemoryRange(std::vector<Event>& expected)
+{
+  bool retval = true;
+
+  cm::optional<EventLogger> o{ 4 };
+
+  auto* ostart = &o;
+  auto* oend = ostart + 1;
+  auto* estart = &o.value();
+  auto* eend = estart + 1;
+
+  if (static_cast<void*>(estart) < static_cast<void*>(ostart) ||
+      static_cast<void*>(eend) > static_cast<void*>(oend)) {
+    std::cout << "value is not within memory range of optional" << std::endl;
+    retval = false;
+  }
+
+  expected = {
+    { Event::VALUE_CONSTRUCT, &*o, nullptr, 4 },
+    { Event::DESTRUCT, &*o, nullptr, 4 },
+  };
+  return retval;
+}
+
+int testOptional(int /*unused*/, char* /*unused*/ [])
+{
+  int retval = 0;
+
+#define DO_EVENT_TEST(name)                                                   \
+  do {                                                                        \
+    events.clear();                                                           \
+    std::vector<Event> expected;                                              \
+    if (!name(expected)) {                                                    \
+      std::cout << "in " #name << std::endl;                                  \
+      retval = 1;                                                             \
+    } else if (expected != events) {                                          \
+      std::cout << #name " did not produce expected events" << std::endl;     \
+      retval = 1;                                                             \
+    }                                                                         \
+  } while (0)
+
+#define DO_TEST(name)                                                         \
+  do {                                                                        \
+    if (!name()) {                                                            \
+      std::cout << "in " #name << std::endl;                                  \
+      retval = 1;                                                             \
+    }                                                                         \
+  } while (0)
+
+  DO_EVENT_TEST(testDefaultConstruct);
+  DO_EVENT_TEST(testNulloptConstruct);
+  DO_EVENT_TEST(testValueConstruct);
+  DO_EVENT_TEST(testInPlaceConstruct);
+  DO_EVENT_TEST(testCopyConstruct);
+  DO_EVENT_TEST(testMoveConstruct);
+  DO_EVENT_TEST(testNulloptAssign);
+  DO_EVENT_TEST(testCopyAssign);
+  DO_EVENT_TEST(testMoveAssign);
+  DO_EVENT_TEST(testPointer);
+  DO_EVENT_TEST(testDereference);
+  DO_EVENT_TEST(testHasValue);
+  DO_EVENT_TEST(testValue);
+  DO_TEST(testValueOr);
+  DO_EVENT_TEST(testSwap);
+  DO_EVENT_TEST(testReset);
+  DO_EVENT_TEST(testEmplace);
+  DO_EVENT_TEST(testMakeOptional);
+  DO_EVENT_TEST(testMemoryRange);
+
+  return retval;
+}

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=170fcd715f586cfd6b9f741c0572d472e0abe8ed
commit 170fcd715f586cfd6b9f741c0572d472e0abe8ed
Author:     Brad King <brad.k...@kitware.com>
AuthorDate: Thu Aug 22 08:28:08 2019 -0400
Commit:     Brad King <brad.k...@kitware.com>
CommitDate: Fri Aug 23 08:43:35 2019 -0400

    Extend C++17 feature checks to require std::optional

diff --git a/Source/Checks/cm_cxx17_check.cpp b/Source/Checks/cm_cxx17_check.cpp
index 593d9b2..29863b1 100644
--- a/Source/Checks/cm_cxx17_check.cpp
+++ b/Source/Checks/cm_cxx17_check.cpp
@@ -1,6 +1,7 @@
 #include <cstdio>
 #include <iterator>
 #include <memory>
+#include <optional>
 #include <unordered_map>
 
 #ifdef _MSC_VER
@@ -27,5 +28,7 @@ int main()
   IDispatchPtr disp(ptr);
 #endif
 
-  return *u + *ai + *(bi - 1) + (3 - static_cast<int>(ci));
+  std::optional<int> oi = 0;
+
+  return *u + *ai + *(bi - 1) + (3 - static_cast<int>(ci)) + oi.value();
 }
diff --git a/bootstrap b/bootstrap
index 4581239..17dc3e8 100755
--- a/bootstrap
+++ b/bootstrap
@@ -1146,6 +1146,20 @@ int check_cxx14()
 }
 #endif
 
+#if __cplusplus >= 201703L
+#include <optional>
+int check_cxx17()
+{
+  std::optional<int> oi = 0;
+  return oi.value();
+}
+#else
+int check_cxx17()
+{
+  return 0;
+}
+#endif
+
 class Class
 {
 public:
@@ -1156,7 +1170,7 @@ private:
 int main()
 {
   auto const c = std::unique_ptr<Class>(new Class);
-  std::cout << c->Get() << check_cxx14() << std::endl;
+  std::cout << c->Get() << check_cxx14() << check_cxx17() << std::endl;
   return 0;
 }
 ' > "${TMPFILE}.cxx"

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=207926795971d260d602390fbd70e3cb78b4deb3
commit 207926795971d260d602390fbd70e3cb78b4deb3
Author:     Zack Galbreath <zack.galbre...@kitware.com>
AuthorDate: Mon Aug 19 13:08:19 2019 -0400
Commit:     Zack Galbreath <zack.galbre...@kitware.com>
CommitDate: Thu Aug 22 15:53:42 2019 -0400

    ctest_build: ignore ANSI color
    
    Ignore ANSI color when scraping logs for errors and warnings

diff --git a/Source/CTest/cmCTestBuildHandler.cxx 
b/Source/CTest/cmCTestBuildHandler.cxx
index bc7c155..60e4b40 100644
--- a/Source/CTest/cmCTestBuildHandler.cxx
+++ b/Source/CTest/cmCTestBuildHandler.cxx
@@ -10,6 +10,7 @@
 #include "cmMakefile.h"
 #include "cmProcessOutput.h"
 #include "cmStringAlgorithms.h"
+#include "cmStringReplaceHelper.h"
 #include "cmSystemTools.h"
 #include "cmXMLWriter.h"
 
@@ -408,6 +409,9 @@ int cmCTestBuildHandler::ProcessHandler()
   // Remember start build time
   this->StartBuild = this->CTest->CurrentTime();
   this->StartBuildTime = std::chrono::system_clock::now();
+
+  cmStringReplaceHelper colorRemover("\x1b\\[[0-9;]*m", "", nullptr);
+  this->ColorRemover = &colorRemover;
   int retVal = 0;
   int res = cmsysProcess_State_Exited;
   if (!this->CTest->GetShowOnly()) {
@@ -1077,7 +1081,12 @@ int cmCTestBuildHandler::ProcessSingleLine(const char* 
data)
     return b_REGULAR_LINE;
   }
 
-  cmCTestOptionalLog(this->CTest, DEBUG, "Line: [" << data << "]" << std::endl,
+  // Ignore ANSI color codes when checking for errors and warnings.
+  std::string input(data);
+  std::string line;
+  this->ColorRemover->Replace(input, line);
+
+  cmCTestOptionalLog(this->CTest, DEBUG, "Line: [" << line << "]" << std::endl,
                      this->Quiet);
 
   int warningLine = 0;
@@ -1089,10 +1098,10 @@ int cmCTestBuildHandler::ProcessSingleLine(const char* 
data)
     // Errors
     int wrxCnt = 0;
     for (cmsys::RegularExpression& rx : this->ErrorMatchRegex) {
-      if (rx.find(data)) {
+      if (rx.find(line.c_str())) {
         errorLine = 1;
         cmCTestOptionalLog(this->CTest, DEBUG,
-                           "  Error Line: " << data << " (matches: "
+                           "  Error Line: " << line << " (matches: "
                                             << this->CustomErrorMatches[wrxCnt]
                                             << ")" << std::endl,
                            this->Quiet);
@@ -1103,11 +1112,11 @@ int cmCTestBuildHandler::ProcessSingleLine(const char* 
data)
     // Error exceptions
     wrxCnt = 0;
     for (cmsys::RegularExpression& rx : this->ErrorExceptionRegex) {
-      if (rx.find(data)) {
+      if (rx.find(line.c_str())) {
         errorLine = 0;
         cmCTestOptionalLog(this->CTest, DEBUG,
                            "  Not an error Line: "
-                             << data << " (matches: "
+                             << line << " (matches: "
                              << this->CustomErrorExceptions[wrxCnt] << ")"
                              << std::endl,
                            this->Quiet);
@@ -1120,11 +1129,11 @@ int cmCTestBuildHandler::ProcessSingleLine(const char* 
data)
     // Warnings
     int wrxCnt = 0;
     for (cmsys::RegularExpression& rx : this->WarningMatchRegex) {
-      if (rx.find(data)) {
+      if (rx.find(line.c_str())) {
         warningLine = 1;
         cmCTestOptionalLog(this->CTest, DEBUG,
                            "  Warning Line: "
-                             << data << " (matches: "
+                             << line << " (matches: "
                              << this->CustomWarningMatches[wrxCnt] << ")"
                              << std::endl,
                            this->Quiet);
@@ -1136,11 +1145,11 @@ int cmCTestBuildHandler::ProcessSingleLine(const char* 
data)
     wrxCnt = 0;
     // Warning exceptions
     for (cmsys::RegularExpression& rx : this->WarningExceptionRegex) {
-      if (rx.find(data)) {
+      if (rx.find(line.c_str())) {
         warningLine = 0;
         cmCTestOptionalLog(this->CTest, DEBUG,
                            "  Not a warning Line: "
-                             << data << " (matches: "
+                             << line << " (matches: "
                              << this->CustomWarningExceptions[wrxCnt] << ")"
                              << std::endl,
                            this->Quiet);
diff --git a/Source/CTest/cmCTestBuildHandler.h 
b/Source/CTest/cmCTestBuildHandler.h
index 722c590..87f1534 100644
--- a/Source/CTest/cmCTestBuildHandler.h
+++ b/Source/CTest/cmCTestBuildHandler.h
@@ -18,6 +18,7 @@
 #include <vector>
 
 class cmMakefile;
+class cmStringReplaceHelper;
 class cmXMLWriter;
 
 /** \class cmCTestBuildHandler
@@ -143,6 +144,9 @@ private:
   int MaxErrors;
   int MaxWarnings;
 
+  // Used to remove ANSI color codes before checking for errors and warnings.
+  cmStringReplaceHelper* ColorRemover;
+
   bool UseCTestLaunch;
   std::string CTestLaunchDir;
   class LaunchHelper;
diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt
index c952b1a..0e93cf8 100644
--- a/Tests/RunCMake/CMakeLists.txt
+++ b/Tests/RunCMake/CMakeLists.txt
@@ -248,7 +248,8 @@ add_RunCMake_test(export)
 add_RunCMake_test(cmake_minimum_required)
 add_RunCMake_test(cmake_parse_arguments)
 add_RunCMake_test(continue)
-add_RunCMake_test(ctest_build)
+add_executable(color_warning color_warning.c)
+add_RunCMake_test(ctest_build -DCOLOR_WARNING=$<TARGET_FILE:color_warning>)
 add_RunCMake_test(ctest_cmake_error)
 add_RunCMake_test(ctest_configure)
 if(COVERAGE_COMMAND)
diff --git a/Tests/RunCMake/color_warning.c b/Tests/RunCMake/color_warning.c
new file mode 100644
index 0000000..831abd9
--- /dev/null
+++ b/Tests/RunCMake/color_warning.c
@@ -0,0 +1,7 @@
+#include <stdio.h>
+int main(void)
+{
+  printf(
+    "/tmp/hello.c:3:2: \033[35mwarning:\033[0m Hello, World! [-W#warnings]\n");
+  return 0;
+}
diff --git a/Tests/RunCMake/ctest_build/IgnoreColor-stdout.txt 
b/Tests/RunCMake/ctest_build/IgnoreColor-stdout.txt
new file mode 100644
index 0000000..cd1720f
--- /dev/null
+++ b/Tests/RunCMake/ctest_build/IgnoreColor-stdout.txt
@@ -0,0 +1,2 @@
+   0 Compiler errors
+   1 Compiler warnings
diff --git a/Tests/RunCMake/ctest_build/RunCMakeTest.cmake 
b/Tests/RunCMake/ctest_build/RunCMakeTest.cmake
index 1092d2a..b2e562a 100644
--- a/Tests/RunCMake/ctest_build/RunCMakeTest.cmake
+++ b/Tests/RunCMake/ctest_build/RunCMakeTest.cmake
@@ -1,6 +1,8 @@
 include(RunCTest)
 
 set(CASE_CTEST_BUILD_ARGS "")
+set(RunCMake_USE_LAUNCHERS TRUE)
+set(RunCMake_USE_CUSTOM_BUILD_COMMAND FALSE)
 
 function(run_ctest_build CASE_NAME)
   set(CASE_CTEST_BUILD_ARGS "${ARGN}")
@@ -45,3 +47,9 @@ function(run_BuildChangeId)
   run_ctest(BuildChangeId)
 endfunction()
 run_BuildChangeId()
+
+set(RunCMake_USE_LAUNCHERS FALSE)
+set(RunCMake_USE_CUSTOM_BUILD_COMMAND TRUE)
+set(RunCMake_BUILD_COMMAND "${COLOR_WARNING}")
+run_ctest(IgnoreColor)
+unset(RunCMake_BUILD_COMMAND)
diff --git a/Tests/RunCMake/ctest_build/test.cmake.in 
b/Tests/RunCMake/ctest_build/test.cmake.in
index 6f15ec9..9f7fa13 100644
--- a/Tests/RunCMake/ctest_build/test.cmake.in
+++ b/Tests/RunCMake/ctest_build/test.cmake.in
@@ -9,7 +9,10 @@ set(CTEST_CMAKE_GENERATOR               "@RunCMake_GENERATOR@")
 set(CTEST_CMAKE_GENERATOR_PLATFORM      "@RunCMake_GENERATOR_PLATFORM@")
 set(CTEST_CMAKE_GENERATOR_TOOLSET       "@RunCMake_GENERATOR_TOOLSET@")
 set(CTEST_BUILD_CONFIGURATION           "$ENV{CMAKE_CONFIG_TYPE}")
-set(CTEST_USE_LAUNCHERS                 TRUE)
+set(CTEST_USE_LAUNCHERS                 "@RunCMake_USE_LAUNCHERS@")
+if (@RunCMake_USE_CUSTOM_BUILD_COMMAND@)
+  set(CTEST_BUILD_COMMAND               "\"@RunCMake_BUILD_COMMAND@\"")
+endif()
 
 set(ctest_build_args "@CASE_CTEST_BUILD_ARGS@")
 ctest_start(Experimental)

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=2a71a0390c6c1130c9b50f717a751dc815310073
commit 2a71a0390c6c1130c9b50f717a751dc815310073
Author:     Zack Galbreath <zack.galbre...@kitware.com>
AuthorDate: Tue Aug 20 10:55:12 2019 -0400
Commit:     Zack Galbreath <zack.galbre...@kitware.com>
CommitDate: Thu Aug 22 13:10:18 2019 -0400

    ctest: rename TRACK to GROUP
    
    Update command-line options, script variables, and documentation to use
    the term "group" instead of "track". The old terms are still available
    for now, but they are now undocumented.
    
    This makes our terminology more consistent with CDash. The goal of this
    change is to make it more clear to our users how CTest and CDash interact
    with each other.

diff --git a/Help/command/ctest_start.rst b/Help/command/ctest_start.rst
index 6db9a48..f0704ac 100644
--- a/Help/command/ctest_start.rst
+++ b/Help/command/ctest_start.rst
@@ -5,9 +5,9 @@ Starts the testing for a given model
 
 ::
 
-  ctest_start(<model> [<source> [<binary>]] [TRACK <track>] [QUIET])
+  ctest_start(<model> [<source> [<binary>]] [GROUP <group>] [QUIET])
 
-  ctest_start([<model> [<source> [<binary>]]] [TRACK <track>] APPEND [QUIET])
+  ctest_start([<model> [<source> [<binary>]]] [GROUP <group>] APPEND [QUIET])
 
 Starts the testing for a given model.  The command should be called
 after the binary directory is initialized.
@@ -26,20 +26,21 @@ The parameters are as follows:
   Set the binary directory. If not specified, the value of
   :variable:`CTEST_BINARY_DIRECTORY` is used instead.
 
-``TRACK <track>``
-  If ``TRACK`` is used, the submissions will go to the specified track on the
-  CDash server. If no ``TRACK`` is specified, the name of the model is used by
-  default.
+``GROUP <group>``
+  If ``GROUP`` is used, the submissions will go to the specified group on the
+  CDash server. If no ``GROUP`` is specified, the name of the model is used by
+  default. This replaces the deprecated option ``TRACK``. Despite the name
+  change its behavior is unchanged.
 
 ``APPEND``
   If ``APPEND`` is used, the existing ``TAG`` is used rather than creating a 
new
   one based on the current time stamp. If you use ``APPEND``, you can omit the
-  ``<model>`` and ``TRACK <track>`` parameters, because they will be read from
+  ``<model>`` and ``GROUP <group>`` parameters, because they will be read from
   the generated ``TAG`` file. For example:
 
   .. code-block:: cmake
 
-    ctest_start(Experimental TRACK TrackExperimental)
+    ctest_start(Experimental GROUP GroupExperimental)
 
   Later, in another ``ctest -S`` script:
 
@@ -48,11 +49,11 @@ The parameters are as follows:
     ctest_start(APPEND)
 
   When the second script runs ``ctest_start(APPEND)``, it will read the
-  ``Experimental`` model and ``TrackExperimental`` track from the ``TAG`` file
+  ``Experimental`` model and ``GroupExperimental`` group from the ``TAG`` file
   generated by the first ``ctest_start()`` command. Please note that if you
-  call ``ctest_start(APPEND)`` and specify a different model or track than
+  call ``ctest_start(APPEND)`` and specify a different model or group than
   in the first ``ctest_start()`` command, a warning will be issued, and the
-  new model and track will be used.
+  new model and group will be used.
 
 ``QUIET``
   If ``QUIET`` is used, CTest will suppress any non-error messages that it
@@ -65,11 +66,11 @@ equivalent:
 
 .. code-block:: cmake
 
-  ctest_start(Experimental path/to/source path/to/binary TRACK SomeTrack QUIET 
APPEND)
+  ctest_start(Experimental path/to/source path/to/binary GROUP SomeGroup QUIET 
APPEND)
 
-  ctest_start(TRACK SomeTrack Experimental QUIET path/to/source APPEND 
path/to/binary)
+  ctest_start(GROUP SomeGroup Experimental QUIET path/to/source APPEND 
path/to/binary)
 
-  ctest_start(APPEND QUIET Experimental path/to/source TRACK SomeTrack 
path/to/binary)
+  ctest_start(APPEND QUIET Experimental path/to/source GROUP SomeGroup 
path/to/binary)
 
 However, for the sake of readability, it is recommended that you order your
 parameters in the order listed at the top of this page.
diff --git a/Help/manual/ctest.1.rst b/Help/manual/ctest.1.rst
index c6b1425..9d93bb8 100644
--- a/Help/manual/ctest.1.rst
+++ b/Help/manual/ctest.1.rst
@@ -482,14 +482,17 @@ a `CDash`_ server. The command-line signature used to 
submit to `CDash`_ is::
 
 Options for Dashboard Client include:
 
-``--track <track>``
- Specify the track to submit dashboard to
+``--group <group>``
+ Specify what group you'd like to submit results to
 
- Submit dashboard to specified track instead of default one.  By
+ Submit dashboard to specified group instead of default one.  By
  default, the dashboard is submitted to Nightly, Experimental, or
- Continuous track, but by specifying this option, the track can be
+ Continuous group, but by specifying this option, the group can be
  arbitrary.
 
+ This replaces the deprecated option ``--track``.
+ Despite the name change its behavior is unchanged.
+
 ``-A <file>, --add-notes <file>``
  Add a notes file with submission.
 
diff --git a/Source/CTest/cmCTestStartCommand.cxx 
b/Source/CTest/cmCTestStartCommand.cxx
index 67ff2db..e4a1844 100644
--- a/Source/CTest/cmCTestStartCommand.cxx
+++ b/Source/CTest/cmCTestStartCommand.cxx
@@ -33,14 +33,16 @@ bool 
cmCTestStartCommand::InitialPass(std::vector<std::string> const& args,
   const char* bld_dir = nullptr;
 
   while (cnt < args.size()) {
-    if (args[cnt] == "TRACK") {
+    if (args[cnt] == "GROUP" || args[cnt] == "TRACK") {
       cnt++;
       if (cnt >= args.size() || args[cnt] == "APPEND" ||
           args[cnt] == "QUIET") {
-        this->SetError("TRACK argument missing track name");
+        std::ostringstream e;
+        e << args[cnt - 1] << " argument missing group name";
+        this->SetError(e.str());
         return false;
       }
-      this->CTest->SetSpecificTrack(args[cnt].c_str());
+      this->CTest->SetSpecificGroup(args[cnt].c_str());
       cnt++;
     } else if (args[cnt] == "APPEND") {
       cnt++;
@@ -113,10 +115,10 @@ bool 
cmCTestStartCommand::InitialPass(std::vector<std::string> const& args,
                          << "   Build directory: " << bld_dir << std::endl,
                        this->Quiet);
   }
-  const char* track = this->CTest->GetSpecificTrack();
-  if (track) {
+  const char* group = this->CTest->GetSpecificGroup();
+  if (group) {
     cmCTestOptionalLog(this->CTest, HANDLER_OUTPUT,
-                       "   Track: " << track << std::endl, this->Quiet);
+                       "   Group: " << group << std::endl, this->Quiet);
   }
 
   // Log startup actions.
diff --git a/Source/CTest/cmCTestSubmitHandler.cxx 
b/Source/CTest/cmCTestSubmitHandler.cxx
index a30999b..4ebb1c8 100644
--- a/Source/CTest/cmCTestSubmitHandler.cxx
+++ b/Source/CTest/cmCTestSubmitHandler.cxx
@@ -569,6 +569,11 @@ int 
cmCTestSubmitHandler::HandleCDashUploadFile(std::string const& file,
       << curl.Escape(this->CTest->GetCTestConfiguration("BuildName")) << "&"
       << "site=" << curl.Escape(this->CTest->GetCTestConfiguration("Site"))
       << "&"
+      << "group=" << curl.Escape(this->CTest->GetTestModelString())
+      << "&"
+      // For now, we send both "track" and "group" to CDash in case we're
+      // submitting to an older instance that still expects the prior
+      // terminology.
       << "track=" << curl.Escape(this->CTest->GetTestModelString()) << "&"
       << "starttime=" << timeNow << "&"
       << "endtime=" << timeNow << "&"
@@ -837,10 +842,10 @@ int cmCTestSubmitHandler::ProcessHandler()
   }
   cmCTestOptionalLog(this->CTest, HANDLER_OUTPUT, "Submit files\n",
                      this->Quiet);
-  const char* specificTrack = this->CTest->GetSpecificTrack();
-  if (specificTrack) {
+  const char* specificGroup = this->CTest->GetSpecificGroup();
+  if (specificGroup) {
     cmCTestOptionalLog(this->CTest, HANDLER_OUTPUT,
-                       "   Send to track: " << specificTrack << std::endl,
+                       "   Send to group: " << specificGroup << std::endl,
                        this->Quiet);
   }
   this->SetLogFile(&ofs);
diff --git a/Source/cmCTest.cxx b/Source/cmCTest.cxx
index e7a16b5..54f0896 100644
--- a/Source/cmCTest.cxx
+++ b/Source/cmCTest.cxx
@@ -155,7 +155,7 @@ struct cmCTest::Private
   bool TomorrowTag = false;
 
   int TestModel = cmCTest::EXPERIMENTAL;
-  std::string SpecificTrack;
+  std::string SpecificGroup;
 
   cmDuration TimeOut = cmDuration::zero();
 
@@ -508,10 +508,10 @@ int cmCTest::Initialize(const char* binary_dir, 
cmCTestStartCommand* command)
             day != lctime->tm_mday) {
           tag.clear();
         }
-        std::string track;
-        if (cmSystemTools::GetLineFromStream(tfin, track) &&
+        std::string group;
+        if (cmSystemTools::GetLineFromStream(tfin, group) &&
             !this->Impl->Parts[PartStart] && !command) {
-          this->Impl->SpecificTrack = track;
+          this->Impl->SpecificGroup = group;
         }
         std::string model;
         if (cmSystemTools::GetLineFromStream(tfin, model) &&
@@ -564,13 +564,13 @@ int cmCTest::Initialize(const char* binary_dir, 
cmCTestStartCommand* command)
         }
       }
     } else {
-      std::string track;
+      std::string group;
       std::string modelStr;
       int model = cmCTest::UNKNOWN;
 
       if (tfin) {
         cmSystemTools::GetLineFromStream(tfin, tag);
-        cmSystemTools::GetLineFromStream(tfin, track);
+        cmSystemTools::GetLineFromStream(tfin, group);
         if (cmSystemTools::GetLineFromStream(tfin, modelStr)) {
           model = GetTestModelFromString(modelStr.c_str());
         }
@@ -605,15 +605,15 @@ int cmCTest::Initialize(const char* binary_dir, 
cmCTestStartCommand* command)
                            quiet);
       }
 
-      if (!this->Impl->SpecificTrack.empty() &&
-          track != this->Impl->SpecificTrack) {
+      if (!this->Impl->SpecificGroup.empty() &&
+          group != this->Impl->SpecificGroup) {
         cmCTestOptionalLog(this, WARNING,
-                           "Track given in TAG does not match "
-                           "track given in ctest_start()"
+                           "Group given in TAG does not match "
+                           "group given in ctest_start()"
                              << std::endl,
                            quiet);
       } else {
-        this->Impl->SpecificTrack = track;
+        this->Impl->SpecificGroup = group;
       }
 
       cmCTestOptionalLog(this, OUTPUT,
@@ -1021,8 +1021,8 @@ int cmCTest::ProcessSteps()
 
 std::string cmCTest::GetTestModelString()
 {
-  if (!this->Impl->SpecificTrack.empty()) {
-    return this->Impl->SpecificTrack;
+  if (!this->Impl->SpecificGroup.empty()) {
+    return this->Impl->SpecificGroup;
   }
   switch (this->Impl->TestModel) {
     case cmCTest::NIGHTLY:
@@ -1908,9 +1908,15 @@ bool cmCTest::HandleCommandLineArguments(size_t& i,
     this->Impl->Debug = true;
     this->Impl->ShowLineNumbers = true;
   }
+  if (this->CheckArgument(arg, "--group") && i < args.size() - 1) {
+    i++;
+    this->Impl->SpecificGroup = args[i];
+  }
+  // This is an undocumented / deprecated option.
+  // "Track" has been renamed to "Group".
   if (this->CheckArgument(arg, "--track") && i < args.size() - 1) {
     i++;
-    this->Impl->SpecificTrack = args[i];
+    this->Impl->SpecificGroup = args[i];
   }
   if (this->CheckArgument(arg, "--show-line-numbers")) {
     this->Impl->ShowLineNumbers = true;
@@ -2769,21 +2775,21 @@ std::vector<std::string>& 
cmCTest::GetInitialCommandLineArguments()
   return this->Impl->InitialCommandLineArguments;
 }
 
-const char* cmCTest::GetSpecificTrack()
+const char* cmCTest::GetSpecificGroup()
 {
-  if (this->Impl->SpecificTrack.empty()) {
+  if (this->Impl->SpecificGroup.empty()) {
     return nullptr;
   }
-  return this->Impl->SpecificTrack.c_str();
+  return this->Impl->SpecificGroup.c_str();
 }
 
-void cmCTest::SetSpecificTrack(const char* track)
+void cmCTest::SetSpecificGroup(const char* group)
 {
-  if (!track) {
-    this->Impl->SpecificTrack.clear();
+  if (!group) {
+    this->Impl->SpecificGroup.clear();
     return;
   }
-  this->Impl->SpecificTrack = track;
+  this->Impl->SpecificGroup = group;
 }
 
 void cmCTest::SetFailover(bool failover)
diff --git a/Source/cmCTest.h b/Source/cmCTest.h
index 7f66378..7fe3455 100644
--- a/Source/cmCTest.h
+++ b/Source/cmCTest.h
@@ -404,9 +404,9 @@ public:
 
   std::vector<std::string>& GetInitialCommandLineArguments();
 
-  /** Set the track to submit to */
-  void SetSpecificTrack(const char* track);
-  const char* GetSpecificTrack();
+  /** Set the group to submit to */
+  void SetSpecificGroup(const char* group);
+  const char* GetSpecificGroup();
 
   void SetFailover(bool failover);
   bool GetFailover() const;
diff --git a/Source/ctest.cxx b/Source/ctest.cxx
index 77a84fd..a69ba15 100644
--- a/Source/ctest.cxx
+++ b/Source/ctest.cxx
@@ -83,7 +83,9 @@ static const char* cmDocumentationOptions[][2] = {
   { "-T <action>, --test-action <action>",
     "Sets the dashboard action to "
     "perform" },
-  { "--track <track>", "Specify the track to submit dashboard to" },
+  { "--group <group>",
+    "Specify what build group on the dashboard you'd like to "
+    "submit results to." },
   { "-S <script>, --script <script>",
     "Execute a dashboard for a "
     "configuration" },
diff --git a/Tests/RunCMake/ctest_start/AppendDifferentGroup-stderr.txt 
b/Tests/RunCMake/ctest_start/AppendDifferentGroup-stderr.txt
new file mode 100644
index 0000000..9e493a6
--- /dev/null
+++ b/Tests/RunCMake/ctest_start/AppendDifferentGroup-stderr.txt
@@ -0,0 +1 @@
+^Group given in TAG does not match group given in ctest_start\(\)$
diff --git a/Tests/RunCMake/ctest_start/AppendDifferentTrack-stdout.txt 
b/Tests/RunCMake/ctest_start/AppendDifferentGroup-stdout.txt
similarity index 85%
copy from Tests/RunCMake/ctest_start/AppendDifferentTrack-stdout.txt
copy to Tests/RunCMake/ctest_start/AppendDifferentGroup-stdout.txt
index 25085ef..5f83653 100644
--- a/Tests/RunCMake/ctest_start/AppendDifferentTrack-stdout.txt
+++ b/Tests/RunCMake/ctest_start/AppendDifferentGroup-stdout.txt
@@ -1,7 +1,7 @@
 Run dashboard with to-be-determined model
-   Source directory: .*/Tests/RunCMake/ctest_start/AppendDifferentTrack
-   Build directory: .*/Tests/RunCMake/ctest_start/AppendDifferentTrack-build
-   Track: ExperimentalDifferent
+   Source directory: .*/Tests/RunCMake/ctest_start/AppendDifferentGroup
+   Build directory: .*/Tests/RunCMake/ctest_start/AppendDifferentGroup-build
+   Group: ExperimentalDifferent
    Site: test-site
    Build name: test-build-name
   Use existing tag: 19551112-2204 - ExperimentalDifferent
diff --git a/Tests/RunCMake/ctest_start/AppendDifferentTrack-stderr.txt 
b/Tests/RunCMake/ctest_start/AppendDifferentTrack-stderr.txt
index 0d6d19d..9e493a6 100644
--- a/Tests/RunCMake/ctest_start/AppendDifferentTrack-stderr.txt
+++ b/Tests/RunCMake/ctest_start/AppendDifferentTrack-stderr.txt
@@ -1 +1 @@
-^Track given in TAG does not match track given in ctest_start\(\)$
+^Group given in TAG does not match group given in ctest_start\(\)$
diff --git a/Tests/RunCMake/ctest_start/AppendDifferentTrack-stdout.txt 
b/Tests/RunCMake/ctest_start/AppendDifferentTrack-stdout.txt
index 25085ef..022e2ec 100644
--- a/Tests/RunCMake/ctest_start/AppendDifferentTrack-stdout.txt
+++ b/Tests/RunCMake/ctest_start/AppendDifferentTrack-stdout.txt
@@ -1,7 +1,7 @@
 Run dashboard with to-be-determined model
    Source directory: .*/Tests/RunCMake/ctest_start/AppendDifferentTrack
    Build directory: .*/Tests/RunCMake/ctest_start/AppendDifferentTrack-build
-   Track: ExperimentalDifferent
+   Group: ExperimentalDifferent
    Site: test-site
    Build name: test-build-name
   Use existing tag: 19551112-2204 - ExperimentalDifferent
diff --git a/Tests/RunCMake/ctest_start/MissingGroupArg-result.txt 
b/Tests/RunCMake/ctest_start/MissingGroupArg-result.txt
new file mode 100644
index 0000000..b57e2de
--- /dev/null
+++ b/Tests/RunCMake/ctest_start/MissingGroupArg-result.txt
@@ -0,0 +1 @@
+(-1|255)
diff --git a/Tests/RunCMake/ctest_start/MissingGroupArg-stderr.txt 
b/Tests/RunCMake/ctest_start/MissingGroupArg-stderr.txt
new file mode 100644
index 0000000..e0480f6
--- /dev/null
+++ b/Tests/RunCMake/ctest_start/MissingGroupArg-stderr.txt
@@ -0,0 +1,2 @@
+^CMake Error at 
.*/Tests/RunCMake/ctest_start/MissingGroupArg/test\.cmake:[0-9]+ 
\(ctest_start\):
+  ctest_start GROUP argument missing group name$
diff --git a/Tests/RunCMake/ctest_start/MissingGroupArgAppend-result.txt 
b/Tests/RunCMake/ctest_start/MissingGroupArgAppend-result.txt
new file mode 100644
index 0000000..b57e2de
--- /dev/null
+++ b/Tests/RunCMake/ctest_start/MissingGroupArgAppend-result.txt
@@ -0,0 +1 @@
+(-1|255)
diff --git a/Tests/RunCMake/ctest_start/MissingGroupArgAppend-stderr.txt 
b/Tests/RunCMake/ctest_start/MissingGroupArgAppend-stderr.txt
new file mode 100644
index 0000000..8ae53ff
--- /dev/null
+++ b/Tests/RunCMake/ctest_start/MissingGroupArgAppend-stderr.txt
@@ -0,0 +1,2 @@
+^CMake Error at 
.*/Tests/RunCMake/ctest_start/MissingGroupArgAppend/test\.cmake:[0-9]+ 
\(ctest_start\):
+  ctest_start GROUP argument missing group name$
diff --git a/Tests/RunCMake/ctest_start/MissingGroupArgQuiet-result.txt 
b/Tests/RunCMake/ctest_start/MissingGroupArgQuiet-result.txt
new file mode 100644
index 0000000..b57e2de
--- /dev/null
+++ b/Tests/RunCMake/ctest_start/MissingGroupArgQuiet-result.txt
@@ -0,0 +1 @@
+(-1|255)
diff --git a/Tests/RunCMake/ctest_start/MissingGroupArgQuiet-stderr.txt 
b/Tests/RunCMake/ctest_start/MissingGroupArgQuiet-stderr.txt
new file mode 100644
index 0000000..c4f8900
--- /dev/null
+++ b/Tests/RunCMake/ctest_start/MissingGroupArgQuiet-stderr.txt
@@ -0,0 +1,2 @@
+^CMake Error at 
.*/Tests/RunCMake/ctest_start/MissingGroupArgQuiet/test\.cmake:[0-9]+ 
\(ctest_start\):
+  ctest_start GROUP argument missing group name$
diff --git a/Tests/RunCMake/ctest_start/MissingTrackArg-stderr.txt 
b/Tests/RunCMake/ctest_start/MissingTrackArg-stderr.txt
index 7b42bc9..2a72a83 100644
--- a/Tests/RunCMake/ctest_start/MissingTrackArg-stderr.txt
+++ b/Tests/RunCMake/ctest_start/MissingTrackArg-stderr.txt
@@ -1,2 +1,2 @@
 ^CMake Error at 
.*/Tests/RunCMake/ctest_start/MissingTrackArg/test\.cmake:[0-9]+ 
\(ctest_start\):
-  ctest_start TRACK argument missing track name$
+  ctest_start TRACK argument missing group name$
diff --git a/Tests/RunCMake/ctest_start/MissingTrackArgAppend-stderr.txt 
b/Tests/RunCMake/ctest_start/MissingTrackArgAppend-stderr.txt
index 695bfad..7ff82ab 100644
--- a/Tests/RunCMake/ctest_start/MissingTrackArgAppend-stderr.txt
+++ b/Tests/RunCMake/ctest_start/MissingTrackArgAppend-stderr.txt
@@ -1,2 +1,2 @@
 ^CMake Error at 
.*/Tests/RunCMake/ctest_start/MissingTrackArgAppend/test\.cmake:[0-9]+ 
\(ctest_start\):
-  ctest_start TRACK argument missing track name$
+  ctest_start TRACK argument missing group name$
diff --git a/Tests/RunCMake/ctest_start/MissingTrackArgQuiet-stderr.txt 
b/Tests/RunCMake/ctest_start/MissingTrackArgQuiet-stderr.txt
index 9438522..c23b1bf 100644
--- a/Tests/RunCMake/ctest_start/MissingTrackArgQuiet-stderr.txt
+++ b/Tests/RunCMake/ctest_start/MissingTrackArgQuiet-stderr.txt
@@ -1,2 +1,2 @@
 ^CMake Error at 
.*/Tests/RunCMake/ctest_start/MissingTrackArgQuiet/test\.cmake:[0-9]+ 
\(ctest_start\):
-  ctest_start TRACK argument missing track name$
+  ctest_start TRACK argument missing group name$
diff --git a/Tests/RunCMake/ctest_start/NoAppendDifferentTrack-stdout.txt 
b/Tests/RunCMake/ctest_start/NoAppendDifferentGroup-stdout.txt
similarity index 81%
copy from Tests/RunCMake/ctest_start/NoAppendDifferentTrack-stdout.txt
copy to Tests/RunCMake/ctest_start/NoAppendDifferentGroup-stdout.txt
index 20a29be..13a3883 100644
--- a/Tests/RunCMake/ctest_start/NoAppendDifferentTrack-stdout.txt
+++ b/Tests/RunCMake/ctest_start/NoAppendDifferentGroup-stdout.txt
@@ -1,7 +1,7 @@
 Run dashboard with model Experimental
-   Source directory: .*/Tests/RunCMake/ctest_start/NoAppendDifferentTrack
-   Build directory: .*/Tests/RunCMake/ctest_start/NoAppendDifferentTrack-build
-   Track: ExperimentalDifferent
+   Source directory: .*/Tests/RunCMake/ctest_start/NoAppendDifferentGroup
+   Build directory: .*/Tests/RunCMake/ctest_start/NoAppendDifferentGroup-build
+   Group: ExperimentalDifferent
    Site: test-site
    Build name: test-build-name
    Use ExperimentalDifferent tag: [0-9-]+
diff --git a/Tests/RunCMake/ctest_start/NoAppendDifferentTrack-stdout.txt 
b/Tests/RunCMake/ctest_start/NoAppendDifferentTrack-stdout.txt
index 20a29be..c511e0d 100644
--- a/Tests/RunCMake/ctest_start/NoAppendDifferentTrack-stdout.txt
+++ b/Tests/RunCMake/ctest_start/NoAppendDifferentTrack-stdout.txt
@@ -1,7 +1,7 @@
 Run dashboard with model Experimental
    Source directory: .*/Tests/RunCMake/ctest_start/NoAppendDifferentTrack
    Build directory: .*/Tests/RunCMake/ctest_start/NoAppendDifferentTrack-build
-   Track: ExperimentalDifferent
+   Group: ExperimentalDifferent
    Site: test-site
    Build name: test-build-name
    Use ExperimentalDifferent tag: [0-9-]+
diff --git a/Tests/RunCMake/ctest_start/RunCMakeTest.cmake 
b/Tests/RunCMake/ctest_start/RunCMakeTest.cmake
index 905ad00..da85b39 100644
--- a/Tests/RunCMake/ctest_start/RunCMakeTest.cmake
+++ b/Tests/RunCMake/ctest_start/RunCMakeTest.cmake
@@ -26,18 +26,24 @@ run_ctest_start(WriteModelToTagExperimental Experimental 
QUIET)
 run_ctest_start(WriteModelToTagContinuous Continuous QUIET)
 run_ctest_start(WriteModelToTagNightly Nightly QUIET)
 run_ctest_start(WriteModelToTagNoMatchingTrack Continuous TRACK 
SomeWeirdTrackName QUIET)
+run_ctest_start(WriteModelToTagNoMatchingGroup Continuous GROUP 
SomeWeirdTrackName QUIET)
 run_ctest_start(AppendSameModel Continuous APPEND)
 run_ctest_start(AppendDifferentModel Experimental APPEND)
 run_ctest_start(AppendNoModel APPEND)
 run_ctest_start(AppendDifferentTrack TRACK ExperimentalDifferent APPEND)
+run_ctest_start(AppendDifferentGroup GROUP ExperimentalDifferent APPEND)
 run_ctest_start(NoAppendDifferentTrack Experimental TRACK 
ExperimentalDifferent)
+run_ctest_start(NoAppendDifferentGroup Experimental GROUP 
ExperimentalDifferent)
 run_ctest_start(AppendNoMatchingTrack Continuous APPEND)
 run_ctest_start(AppendOldContinuous Continuous APPEND)
 run_ctest_start(AppendOldNoModel APPEND)
 run_ctest_start(NoModel QUIET)
 run_ctest_start(MissingTrackArg Experimental TRACK)
+run_ctest_start(MissingGroupArg Experimental GROUP)
 run_ctest_start(MissingTrackArgAppend Experimental TRACK APPEND)
+run_ctest_start(MissingGroupArgAppend Experimental GROUP APPEND)
 run_ctest_start(MissingTrackArgQuiet Experimental TRACK QUIET)
+run_ctest_start(MissingGroupArgQuiet Experimental GROUP QUIET)
 run_ctest_start(TooManyArgs Experimental
                 ${RunCMake_BINARY_DIR}/TooManyArgs-build
                 ${RunCMake_BINARY_DIR}/TooManyArgs-build
diff --git 
a/Tests/RunCMake/ctest_start/WriteModelToTagNoMatchingGroup-check.cmake 
b/Tests/RunCMake/ctest_start/WriteModelToTagNoMatchingGroup-check.cmake
new file mode 100644
index 0000000..bd2862d
--- /dev/null
+++ b/Tests/RunCMake/ctest_start/WriteModelToTagNoMatchingGroup-check.cmake
@@ -0,0 +1 @@
+check_tag_contents("^[0-9-]+\nSomeWeirdTrackName\nContinuous\n$")

-----------------------------------------------------------------------

Summary of changes:
 Help/command/ctest_start.rst                       |  29 +-
 Help/manual/ctest.1.rst                            |  11 +-
 Modules/Internal/CPack/CPack.STGZ_Header.sh.in     |  22 +-
 Source/CTest/cmCTestBuildHandler.cxx               |  27 +-
 Source/CTest/cmCTestBuildHandler.h                 |   4 +
 Source/CTest/cmCTestStartCommand.cxx               |  14 +-
 Source/CTest/cmCTestSubmitHandler.cxx              |  11 +-
 Source/Checks/cm_cxx17_check.cpp                   |   5 +-
 Source/cmCTest.cxx                                 |  48 +-
 Source/cmCTest.h                                   |   6 +-
 Source/cm_optional.hxx                             | 343 ++++++++++
 Source/cm_utility.hxx                              |  35 ++
 Source/ctest.cxx                                   |   4 +-
 Tests/CMakeLib/CMakeLists.txt                      |   1 +
 Tests/CMakeLib/testOptional.cxx                    | 690 +++++++++++++++++++++
 Tests/RunCMake/CMakeLists.txt                      |   3 +-
 Tests/RunCMake/color_warning.c                     |   7 +
 Tests/RunCMake/ctest_build/IgnoreColor-stdout.txt  |   2 +
 Tests/RunCMake/ctest_build/RunCMakeTest.cmake      |   8 +
 Tests/RunCMake/ctest_build/test.cmake.in           |   5 +-
 .../ctest_start/AppendDifferentGroup-stderr.txt    |   1 +
 ...-stdout.txt => AppendDifferentGroup-stdout.txt} |   6 +-
 .../ctest_start/AppendDifferentTrack-stderr.txt    |   2 +-
 .../ctest_start/AppendDifferentTrack-stdout.txt    |   2 +-
 .../MissingGroupArg-result.txt}                    |   0
 .../ctest_start/MissingGroupArg-stderr.txt         |   2 +
 .../MissingGroupArgAppend-result.txt}              |   0
 .../ctest_start/MissingGroupArgAppend-stderr.txt   |   2 +
 .../MissingGroupArgQuiet-result.txt}               |   0
 .../ctest_start/MissingGroupArgQuiet-stderr.txt    |   2 +
 .../ctest_start/MissingTrackArg-stderr.txt         |   2 +-
 .../ctest_start/MissingTrackArgAppend-stderr.txt   |   2 +-
 .../ctest_start/MissingTrackArgQuiet-stderr.txt    |   2 +-
 ...tdout.txt => NoAppendDifferentGroup-stdout.txt} |   6 +-
 .../ctest_start/NoAppendDifferentTrack-stdout.txt  |   2 +-
 Tests/RunCMake/ctest_start/RunCMakeTest.cmake      |   6 +
 ... => WriteModelToTagNoMatchingGroup-check.cmake} |   0
 bootstrap                                          |  16 +-
 38 files changed, 1242 insertions(+), 86 deletions(-)
 create mode 100644 Source/cm_optional.hxx
 create mode 100644 Source/cm_utility.hxx
 create mode 100644 Tests/CMakeLib/testOptional.cxx
 create mode 100644 Tests/RunCMake/color_warning.c
 create mode 100644 Tests/RunCMake/ctest_build/IgnoreColor-stdout.txt
 create mode 100644 Tests/RunCMake/ctest_start/AppendDifferentGroup-stderr.txt
 copy Tests/RunCMake/ctest_start/{AppendDifferentTrack-stdout.txt => 
AppendDifferentGroup-stdout.txt} (85%)
 copy Tests/RunCMake/{ctest_submit/RepeatRETURN_VALUE-result.txt => 
ctest_start/MissingGroupArg-result.txt} (100%)
 create mode 100644 Tests/RunCMake/ctest_start/MissingGroupArg-stderr.txt
 copy Tests/RunCMake/{ctest_submit/RepeatRETURN_VALUE-result.txt => 
ctest_start/MissingGroupArgAppend-result.txt} (100%)
 create mode 100644 Tests/RunCMake/ctest_start/MissingGroupArgAppend-stderr.txt
 copy Tests/RunCMake/{ctest_submit/RepeatRETURN_VALUE-result.txt => 
ctest_start/MissingGroupArgQuiet-result.txt} (100%)
 create mode 100644 Tests/RunCMake/ctest_start/MissingGroupArgQuiet-stderr.txt
 copy Tests/RunCMake/ctest_start/{NoAppendDifferentTrack-stdout.txt => 
NoAppendDifferentGroup-stdout.txt} (81%)
 copy Tests/RunCMake/ctest_start/{WriteModelToTagNoMatchingTrack-check.cmake => 
WriteModelToTagNoMatchingGroup-check.cmake} (100%)


hooks/post-receive
-- 
CMake
_______________________________________________
Cmake-commits mailing list
Cmake-commits@cmake.org
https://cmake.org/mailman/listinfo/cmake-commits

Reply via email to