From: Pavel Sanda Date: Sat, 2 Jul 2011 13:08:36 +0000 (+0000) Subject: VCS: RCS implementation for date and author insetinfo was missing. X-Git-Tag: 2.1.0beta1~2975 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=d958d89b35512809cacab539192e37990b243ea0;p=features.git VCS: RCS implementation for date and author insetinfo was missing. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@39231 a592a061-630c-0410-9148-cb99ea01b6c8 --- diff --git a/lib/doc/Additional.lyx b/lib/doc/Additional.lyx index 6072597d4f..8d2c298761 100644 --- a/lib/doc/Additional.lyx +++ b/lib/doc/Additional.lyx @@ -1,4 +1,4 @@ -#LyX 2.0 created this file. For more info see http://www.lyx.org/ +#LyX 2.1 created this file. For more info see http://www.lyx.org/ \lyxformat 413 \begin_document \begin_header @@ -19434,7 +19434,13 @@ Revision info \end_layout \begin_layout Standard -LyX supports RCS version number information (only), see +LyX supports RCS version number, author name, date and time of last commit. + All those are extracted from +\family typewriter +rlog -r +\family default +. + For other details see \begin_inset CommandInset ref LatexCommand ref reference "sub:VCS-Revision-Information" diff --git a/src/VCBackend.cpp b/src/VCBackend.cpp index 1c8520e7a2..28ed40c5e2 100644 --- a/src/VCBackend.cpp +++ b/src/VCBackend.cpp @@ -352,14 +352,73 @@ bool RCS::toggleReadOnlyEnabled() return false; } + string RCS::revisionInfo(LyXVC::RevisionInfo const info) { if (info == LyXVC::File) return version_; + // fill the rest of the attributes for a single file + if (rev_date_cache_.empty()) + if (!getRevisionInfo()) + return string(); + + switch (info) { + case LyXVC::Author: + return rev_author_cache_; + case LyXVC::Date: + return rev_date_cache_; + case LyXVC::Time: + return rev_time_cache_; + default: ; + } + return string(); } +bool RCS::getRevisionInfo() +{ + FileName tmpf = FileName::tempName("lyxvcout"); + if (tmpf.empty()) { + LYXERR(Debug::LYXVC, "Could not generate logfile " << tmpf); + return false; + } + doVCCommand("rlog -r " + quoteName(onlyFileName(owner_->absFileName())) + + " > " + quoteName(tmpf.toFilesystemEncoding()), + FileName(owner_->filePath())); + + if (tmpf.empty()) + return false; + + ifstream ifs(tmpf.toFilesystemEncoding().c_str()); + string line; + + // we reached to the entry, i.e. after initial log message + bool entry=false; + // line with critical info, e.g: + //"date: 2011/07/02 11:02:54; author: sanda; state: Exp; lines: +17 -2" + string result; + + while (ifs) { + getline(ifs, line); + LYXERR(Debug::LYXVC, line); + if (entry && prefixIs(line, "date:")) { + result = line; + break; + } + if (prefixIs(line, "revision")) + entry = true; + } + if (result.empty()) + return false; + + rev_date_cache_ = token(result, ' ', 1); + rev_time_cache_ = rtrim(token(result, ' ', 2), ";"); + rev_author_cache_ = trim(token(token(result, ';', 1), ':', 1)); + + return !rev_author_cache_.empty(); +} + bool RCS::prepareFileRevision(string const &revis, string & f) { string rev = revis; diff --git a/src/VCBackend.h b/src/VCBackend.h index 3dbf557971..78ccbd4725 100644 --- a/src/VCBackend.h +++ b/src/VCBackend.h @@ -176,6 +176,7 @@ public: protected: virtual void scanMaster(); private: + bool getRevisionInfo(); /** * The version of the VC file. I am not sure if this can be a * string or if it must be a float/int. @@ -183,6 +184,12 @@ private: std::string version_; /// The user currently keeping the lock on the VC file (or "Unlocked"). std::string locker_; + /// Cache for revision info. + std::string rev_date_cache_; + /// + std::string rev_time_cache_; + /// + std::string rev_author_cache_; };