/*============================================================================
  CMake - Cross Platform Makefile Generator
  Copyright 2000-2009 Kitware, Inc.

  Distributed under the OSI-approved BSD License (the "License");
  see accompanying file Copyright.txt for details.

  This software is distributed WITHOUT ANY WARRANTY; without even the
  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  See the License for more information.
============================================================================*/
#include "cmCTestBZR.h"

#include "cmCTest.h"
#include "cmSystemTools.h"
#include "cmXMLParser.h"
#include "cmXMLSafe.h"

#include <cmsys/RegularExpression.hxx>

#include <cm_expat.h>

//----------------------------------------------------------------------------
extern "C"
int cmBZRXMLParserUnknownEncodingHandler(void*,
                                         const XML_Char *name,
                                         XML_Encoding *info)
{
  static const int latin1[]=
    {
      0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
      0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
      0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
      0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
      0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
      0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
      0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
      0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
      0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
      0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
      0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
      0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
      0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
      0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
      0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
      0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
      0x20AC, 0x0081, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
      0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008D, 0x017D, 0x008F,
      0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
      0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x009D, 0x017E, 0x0178,
      0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
      0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
      0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
      0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
      0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
      0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
      0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
      0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
      0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
      0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
      0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
      0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF
    };

  // The BZR xml output plugin can use some encodings that are not
  // recognized by expat.  This will lead to an error, e.g. "Error
  // parsing bzr log xml: unknown encoding", the following is a
  // workaround for these unknown encodings.
  if(name == std::string("ascii") || name == std::string("cp1252") ||
     name == std::string("ANSI_X3.4-1968"))
    {
    for(unsigned int i=0;i<256;++i) info->map[i] = latin1[i];
    return 1;
    }

  return 0;
}

//----------------------------------------------------------------------------
cmCTestBZR::cmCTestBZR(cmCTest* ct, std::ostream& log):
  cmCTestGlobalVC(ct, log)
{
  this->PriorRev = this->Unknown;
  // Even though it is specified in the documention, with bzr 1.13
  // BZR_PROGRESS_BAR has no effect. In the future this bug might be fixed.
  // Since it doesn't hurt, we specify this environment variable.
  cmSystemTools::PutEnv("BZR_PROGRESS_BAR=none");
}

//----------------------------------------------------------------------------
cmCTestBZR::~cmCTestBZR()
{
}

//----------------------------------------------------------------------------
class cmCTestBZR::InfoParser: public cmCTestVC::LineParser
{
public:
  InfoParser(cmCTestBZR* bzr, const char* prefix):
    BZR(bzr), CheckOutFound(false)
    {
    this->SetLog(&bzr->Log, prefix);
    this->RegexCheckOut.compile("checkout of branch: *([^\t\r\n]+)$");
    this->RegexParent.compile("parent branch: *([^\t\r\n]+)$");
    }
private:
  cmCTestBZR* BZR;
  bool CheckOutFound;
  cmsys::RegularExpression RegexCheckOut;
  cmsys::RegularExpression RegexParent;
  virtual bool ProcessLine()
    {
    if(this->RegexCheckOut.find(this->Line))
      {
      this->BZR->URL = this->RegexCheckOut.match(1);
      CheckOutFound = true;
      }
    else if(!CheckOutFound && this->RegexParent.find(this->Line))
      {
      this->BZR->URL = this->RegexParent.match(1);
      }
    return true;
    }
};

//----------------------------------------------------------------------------
class cmCTestBZR::RevnoParser: public cmCTestVC::LineParser
{
public:
  RevnoParser(cmCTestBZR* bzr, const char* prefix, std::string& rev):
    Rev(rev)
    {
    this->SetLog(&bzr->Log, prefix);
    this->RegexRevno.compile("^([0-9]+)$");
    }
private:
  std::string& Rev;
  cmsys::RegularExpression RegexRevno;
  virtual bool ProcessLine()
    {
    if(this->RegexRevno.find(this->Line))
      {
      this->Rev = this->RegexRevno.match(1);
      }
    return true;
    }
};

//----------------------------------------------------------------------------
std::string cmCTestBZR::LoadInfo()
{
  // Run "bzr info" to get the repository info from the work tree.
  const char* bzr = this->CommandLineTool.c_str();
  const char* bzr_info[] = {bzr, "info", 0};
  InfoParser iout(this, "info-out> ");
  OutputLogger ierr(this->Log, "info-err> ");
  this->RunChild(bzr_info, &iout, &ierr);

  // Run "bzr revno" to get the repository revision number from the work tree.
  const char* bzr_revno[] = {bzr, "revno", 0};
  std::string rev;
  RevnoParser rout(this, "revno-out> ", rev);
  OutputLogger rerr(this->Log, "revno-err> ");
  this->RunChild(bzr_revno, &rout, &rerr);

  return rev;
}

void cmCTestBZR::NoteOldRevision()
{
  this->OldRevision = this->LoadInfo();
  this->Log << "Revision before update: " << this->OldRevision << "\n";
  cmCTestLog(this->CTest, HANDLER_OUTPUT, "   Old revision of repository is: "
             << this->OldRevision << "\n");
  this->PriorRev.Rev = this->OldRevision;
}

//----------------------------------------------------------------------------
void cmCTestBZR::NoteNewRevision()
{
  this->NewRevision = this->LoadInfo();
  this->Log << "Revision after update: " << this->NewRevision << "\n";
  cmCTestLog(this->CTest, HANDLER_OUTPUT, "   New revision of repository is: "
             << this->NewRevision << "\n");
  this->Log << "URL = " << this->URL << "\n";
}

//----------------------------------------------------------------------------
class cmCTestBZR::LogParser: public cmCTestVC::OutputLogger,
                             private cmXMLParser
{
public:
  LogParser(cmCTestBZR* bzr, const char* prefix):
    OutputLogger(bzr->Log, prefix), BZR(bzr),
    EmailRegex("(.*) <([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+)>")
    { this->InitializeParser(); }
  ~LogParser() { this->CleanupParser(); }

  virtual int InitializeParser()
     {
     int res = cmXMLParser::InitializeParser();
     if (res)
       {
       XML_SetUnknownEncodingHandler(static_cast<XML_Parser>(this->Parser),
                                     cmBZRXMLParserUnknownEncodingHandler, 0);
       }
     return res;
     }
private:
  cmCTestBZR* BZR;

  typedef cmCTestBZR::Revision Revision;
  typedef cmCTestBZR::Change   Change;
  Revision Rev;
  std::vector<Change> Changes;
  Change CurChange;
  std::vector<char> CData;

  cmsys::RegularExpression EmailRegex;

  virtual bool ProcessChunk(const char* data, int length)
    {
    this->OutputLogger::ProcessChunk(data, length);
    this->ParseChunk(data, length);
    return true;
    }

  virtual void StartElement(const std::string& name, const char**)
    {
    this->CData.clear();
    if(name == "log")
      {
      this->Rev = Revision();
      this->Changes.clear();
      }
    // affected-files can contain blocks of
    // modified, unknown, renamed, kind-changed, removed, conflicts, added
    else if(name == "modified"
            || name == "renamed"
            || name == "kind-changed")
      {
      this->CurChange = Change();
      this->CurChange.Action = 'M';
      }
    else if(name == "added")
      {
      this->CurChange = Change();
      this->CurChange = 'A';
      }
    else if(name == "removed")
      {
      this->CurChange = Change();
      this->CurChange = 'D';
      }
    else if(name == "unknown"
            || name == "conflicts")
      {
      // Should not happen here
      this->CurChange = Change();
      }
    }

  virtual void CharacterDataHandler(const char* data, int length)
    {
    this->CData.insert(this->CData.end(), data, data+length);
    }

  virtual void EndElement(const std::string& name)
    {
    if(name == "log")
      {
      this->BZR->DoRevision(this->Rev, this->Changes);
      }
    else if(!this->CData.empty() &&
            (name == "file" || name == "directory"))
      {
      this->CurChange.Path.assign(&this->CData[0], this->CData.size());
      cmSystemTools::ConvertToUnixSlashes(this->CurChange.Path);
      this->Changes.push_back(this->CurChange);
      }
    else if(!this->CData.empty() && name == "symlink")
      {
      // symlinks have an arobase at the end in the log
      this->CurChange.Path.assign(&this->CData[0], this->CData.size()-1);
      cmSystemTools::ConvertToUnixSlashes(this->CurChange.Path);
      this->Changes.push_back(this->CurChange);
      }
    else if(!this->CData.empty() && name == "committer")
      {
      this->Rev.Author.assign(&this->CData[0], this->CData.size());
      if(this->EmailRegex.find(this->Rev.Author))
        {
        this->Rev.Author = this->EmailRegex.match(1);
        this->Rev.EMail = this->EmailRegex.match(2);
        }
      }
    else if(!this->CData.empty() && name == "timestamp")
      {
      this->Rev.Date.assign(&this->CData[0], this->CData.size());
      }
    else if(!this->CData.empty() && name == "message")
      {
      this->Rev.Log.assign(&this->CData[0], this->CData.size());
      }
    else if(!this->CData.empty() && name == "revno")
      {
      this->Rev.Rev.assign(&this->CData[0], this->CData.size());
      }
    this->CData.clear();
    }

  virtual void ReportError(int, int, const char* msg)
    {
    this->BZR->Log << "Error parsing bzr log xml: " << msg << "\n";
    }
};

//----------------------------------------------------------------------------
class cmCTestBZR::UpdateParser: public cmCTestVC::LineParser
{
public:
  UpdateParser(cmCTestBZR* bzr, const char* prefix): BZR(bzr)
    {
    this->SetLog(&bzr->Log, prefix);
    this->RegexUpdate.compile("^([-+R?XCP ])([NDKM ])([* ]) +(.+)$");
    }
private:
  cmCTestBZR* BZR;
  cmsys::RegularExpression RegexUpdate;

  virtual bool ProcessChunk(const char* first, int length)
    {
    bool last_is_new_line = (*first == '\r' || *first == '\n');

    const char* const last = first + length;
    for(const char* c = first; c != last; ++c)
      {
      if(*c == '\r' || *c == '\n')
        {
        if(!last_is_new_line)
          {
          // Log this line.
          if(this->Log && this->Prefix)
            {
            *this->Log << this->Prefix << this->Line << "\n";
            }

          // Hand this line to the subclass implementation.
          if(!this->ProcessLine())
            {
            this->Line = "";
            return false;
            }

          this->Line = "";
          last_is_new_line = true;
          }
        }
      else
        {
        // Append this character to the line under construction.
        this->Line.append(1, *c);
        last_is_new_line = false;
        }
      }
    return true;
    }

  bool ProcessLine()
    {
    if(this->RegexUpdate.find(this->Line))
      {
      this->DoPath(this->RegexUpdate.match(1)[0],
                   this->RegexUpdate.match(2)[0],
                   this->RegexUpdate.match(3)[0],
                   this->RegexUpdate.match(4));
      }
    return true;
    }

  void DoPath(char c0, char c1, char c2, std::string path)
    {
    if(path.empty()) return;
    cmSystemTools::ConvertToUnixSlashes(path);

    const std::string dir = cmSystemTools::GetFilenamePath(path);
    const std::string name = cmSystemTools::GetFilenameName(path);

    if ( c0=='C' )
      {
      this->BZR->Dirs[dir][name].Status = PathConflicting;
      return;
      }

    if ( c1=='M' || c1=='K' || c1=='N' || c1=='D' || c2 =='*' )
      {
      this->BZR->Dirs[dir][name].Status = PathUpdated;
      return;
      }
    }
};

//----------------------------------------------------------------------------
bool cmCTestBZR::UpdateImpl()
{
  // Get user-specified update options.
  std::string opts = this->CTest->GetCTestConfiguration("UpdateOptions");
  if(opts.empty())
    {
    opts = this->CTest->GetCTestConfiguration("BZRUpdateOptions");
    }
  std::vector<std::string> args = cmSystemTools::ParseArguments(opts.c_str());

  // TODO: if(this->CTest->GetTestModel() == cmCTest::NIGHTLY)

  // Use "bzr pull" to update the working tree.
  std::vector<char const*> bzr_update;
  bzr_update.push_back(this->CommandLineTool.c_str());
  bzr_update.push_back("pull");

  for(std::vector<std::string>::const_iterator ai = args.begin();
      ai != args.end(); ++ai)
    {
    bzr_update.push_back(ai->c_str());
    }

  bzr_update.push_back(this->URL.c_str());

  bzr_update.push_back(0);

  // For some reason bzr uses stderr to display the update status.
  OutputLogger out(this->Log, "pull-out> ");
  UpdateParser err(this, "pull-err> ");
  return this->RunUpdateCommand(&bzr_update[0], &out, &err);
}

//----------------------------------------------------------------------------
void cmCTestBZR::LoadRevisions()
{
  cmCTestLog(this->CTest, HANDLER_OUTPUT,
             "   Gathering version information (one . per revision):\n"
             "    " << std::flush);

  // We are interested in every revision included in the update.
  this->Revisions.clear();
  std::string revs;
  if(atoi(this->OldRevision.c_str()) <= atoi(this->NewRevision.c_str()))
    {
    // DoRevision takes care of discarding the information about OldRevision
    revs = this->OldRevision + ".." + this->NewRevision;
    }
  else
    {
    return;
    }

  // Run "bzr log" to get all global revisions of interest.
  const char* bzr = this->CommandLineTool.c_str();
  const char* bzr_log[] = {bzr, "log", "-v", "-r", revs.c_str(), "--xml",
                           this->URL.c_str(), 0};
  {
  LogParser out(this, "log-out> ");
  OutputLogger err(this->Log, "log-err> ");
  this->RunChild(bzr_log, &out, &err);
  }
  cmCTestLog(this->CTest, HANDLER_OUTPUT, std::endl);
}

//----------------------------------------------------------------------------
class cmCTestBZR::StatusParser: public cmCTestVC::LineParser
{
public:
  StatusParser(cmCTestBZR* bzr, const char* prefix): BZR(bzr)
    {
    this->SetLog(&bzr->Log, prefix);
    this->RegexStatus.compile("^([-+R?XCP ])([NDKM ])([* ]) +(.+)$");
    }
private:
  cmCTestBZR* BZR;
  cmsys::RegularExpression RegexStatus;
  bool ProcessLine()
    {
    if(this->RegexStatus.find(this->Line))
      {
      this->DoPath(this->RegexStatus.match(1)[0],
                   this->RegexStatus.match(2)[0],
                   this->RegexStatus.match(3)[0],
                   this->RegexStatus.match(4));
      }
    return true;
    }

  void DoPath(char c0, char c1, char c2, std::string path)
    {
    if(path.empty()) return;
    cmSystemTools::ConvertToUnixSlashes(path);

    if ( c0=='C' )
      {
      this->BZR->DoModification(PathConflicting, path);
      return;
      }

    if ( c0 == '+' || c0 == 'R' || c0 == 'P'
         || c1=='M' || c1=='K' || c1=='N' || c1=='D'
         || c2 =='*' )
      {
      this->BZR->DoModification(PathModified, path);
      return;
      }
    }
};

//----------------------------------------------------------------------------
void cmCTestBZR::LoadModifications()
{
  // Run "bzr status" which reports local modifications.
  const char* bzr = this->CommandLineTool.c_str();
  const char* bzr_status[] = {bzr, "status", "-SV", 0};
  StatusParser out(this, "status-out> ");
  OutputLogger err(this->Log, "status-err> ");
  this->RunChild(bzr_status, &out, &err);
}
