summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2010-06-23 09:14:43 -0400
committerBrad King <brad.king@kitware.com>2010-06-23 09:14:43 -0400
commitbbfe241c6a4386a39ebb93cdb70a8390eab14eef (patch)
tree054d21feea9aa984dfe692a4d562b68c091e2b8a
parentb1418625645ebef66e54d75004c82d88807e154f (diff)
downloadcmake-bbfe241c6a4386a39ebb93cdb70a8390eab14eef.tar.gz
CTest: Parse empty Git commits correctly
Git's diff-tree format has no '\n'-terminated blank line at the end of its commit message body block if there are no diff lines. Instead the message body is terminated by '\0' and there is no diff section. Teach CTest to parse the format in this case.
-rw-r--r--Source/CTest/cmCTestGIT.cxx9
-rw-r--r--Source/cmProcessTools.cxx6
-rw-r--r--Source/cmProcessTools.h1
-rw-r--r--Tests/CTestUpdateGIT.cmake.in20
4 files changed, 32 insertions, 4 deletions
diff --git a/Source/CTest/cmCTestGIT.cxx b/Source/CTest/cmCTestGIT.cxx
index 6c3631c90a..a49c8521af 100644
--- a/Source/CTest/cmCTestGIT.cxx
+++ b/Source/CTest/cmCTestGIT.cxx
@@ -317,8 +317,12 @@ protected:
\n
Log message indented by (4) spaces\n
(even blank lines have the spaces)\n
+ [[
\n
[Diff format]
+ OR
+ \0
+ ]]
The header may have more fields. See 'git help diff-tree'.
*/
@@ -372,6 +376,11 @@ private:
{
if(this->Line.empty())
{
+ if(this->Section == SectionBody && this->LineEnd == '\0')
+ {
+ // Skip SectionDiff
+ this->NextSection();
+ }
this->NextSection();
}
else
diff --git a/Source/cmProcessTools.cxx b/Source/cmProcessTools.cxx
index cacd7663ad..d2f7bf3208 100644
--- a/Source/cmProcessTools.cxx
+++ b/Source/cmProcessTools.cxx
@@ -44,7 +44,7 @@ void cmProcessTools::RunProcess(struct cmsysProcess_s* cp,
//----------------------------------------------------------------------------
cmProcessTools::LineParser::LineParser(char sep, bool ignoreCR):
- Separator(sep), IgnoreCR(ignoreCR), Log(0), Prefix(0)
+ Separator(sep), IgnoreCR(ignoreCR), Log(0), Prefix(0), LineEnd('\0')
{
}
@@ -61,8 +61,10 @@ bool cmProcessTools::LineParser::ProcessChunk(const char* first, int length)
const char* last = first + length;
for(const char* c = first; c != last; ++c)
{
- if(*c == this->Separator)
+ if(*c == this->Separator || *c == '\0')
{
+ this->LineEnd = *c;
+
// Log this line.
if(this->Log && this->Prefix)
{
diff --git a/Source/cmProcessTools.h b/Source/cmProcessTools.h
index 0b210af108..439726dd09 100644
--- a/Source/cmProcessTools.h
+++ b/Source/cmProcessTools.h
@@ -55,6 +55,7 @@ public:
bool IgnoreCR;
std::ostream* Log;
const char* Prefix;
+ char LineEnd;
std::string Line;
virtual bool ProcessChunk(const char* data, int length);
diff --git a/Tests/CTestUpdateGIT.cmake.in b/Tests/CTestUpdateGIT.cmake.in
index 4ac1b31770..f672a524ee 100644
--- a/Tests/CTestUpdateGIT.cmake.in
+++ b/Tests/CTestUpdateGIT.cmake.in
@@ -131,6 +131,22 @@ run_child(
COMMAND ${GIT} submodule update
)
+# 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"
+ )
+
#-----------------------------------------------------------------------------
# Make changes in the working tree.
message("Changing content...")
@@ -196,7 +212,7 @@ macro(rewind_source src_dir)
message("Backing up to revision 1...")
run_child(
WORKING_DIRECTORY ${TOP}/${src_dir}
- COMMAND ${GIT} reset --hard origin/master~2
+ COMMAND ${GIT} reset --hard ${revision1}
)
run_child(
WORKING_DIRECTORY ${TOP}/${src_dir}
@@ -261,7 +277,7 @@ execute_process(
)
execute_process(
WORKING_DIRECTORY \"${TOP}/dash-source\"
- COMMAND \"${GIT}\" reset --hard master~2
+ COMMAND \"${GIT}\" reset --hard ${revision1}
)
execute_process(
WORKING_DIRECTORY \"${TOP}/dash-source\"