]> git.lyx.org Git - lyx.git/blobdiff - src/VCBackend.cpp
Sanitize cursors after a buffer has been reloaded
[lyx.git] / src / VCBackend.cpp
index b20a586090379718c4e153a69e22488cb6673b1d..ca603c9e1f8ed89c1c3ea9cd35ed045815485c41 100644 (file)
@@ -61,7 +61,7 @@ int VCS::doVCCommand(string const & cmd, FileName const & path, bool reportError
        if (ret && reportError) {
                docstring rcsmsg;
                if (prefixIs(cmd, "ci "))
-                       rcsmsg = "\n" + _("Perhaps the RCS package is not installed on your system?");
+                       rcsmsg = "\n" + _("Check whether the GNU RCS package is installed on your system.");
                frontend::Alert::error(_("Revision control error."),
                        bformat(_("Some problem occurred while running the command:\n"
                                  "'%1$s'.") + rcsmsg,
@@ -536,19 +536,25 @@ CVS::CVS(FileName const & m, Buffer * b) : VCS(b)
 
 FileName const CVS::findFile(FileName const & file)
 {
-       LYXERR(Debug::LYXVC, "LyXVC: Checking if "
-                  << onlyFileName(file.absFileName()) << "is under cvs");
-       // First we look for the CVS/Entries in the same dir where we have file.
+       // First we look for the CVS/Entries in the same dir
+       // where we have file.
        // Note that it is not necessary to search parent directories, since
        // there will be a CVS/Entries file in every subdirectory.
        FileName const entries(onlyPath(file.absFileName()) + "/CVS/Entries");
+       string const tmpf = '/' + onlyFileName(file.absFileName()) + '/';
+       LYXERR(Debug::LYXVC, "LyXVC: Checking if file is under cvs in `" << entries
+                            << "' for `" << tmpf << '\'');
        if (entries.isReadableFile()) {
-               // We are in a CVS-managed directory
-               // See if the file is known to CVS
-               string const cmd = "cvs log " + quoteName(file.toFilesystemEncoding());
-               int const ret = doVCCommandCall(cmd, file.onlyPath());
-               if (ret == 0)
-                       return entries;
+               // Ok we are at least in a CVS dir. Parse the CVS/Entries
+               // and see if we can find this file. We do a fast and
+               // dirty parse here.
+               ifstream ifs(entries.toFilesystemEncoding().c_str());
+               string line;
+               while (getline(ifs, line)) {
+                       LYXERR(Debug::LYXVC, "\tEntries: " << line);
+                       if (contains(line, tmpf))
+                               return entries;
+               }
        }
        return FileName();
 }
@@ -1826,13 +1832,23 @@ bool GIT::findFile(FileName const & file)
                return false;
        }
 
-       // Now we check if the file is known to git.
+       // Now we check the status of the file.
+       TempFile tempfile("lyxvcout");
+       FileName tmpf = tempfile.name();
+       if (tmpf.empty()) {
+               LYXERR(Debug::LYXVC, "Could not generate logfile " << tmpf);
+               return false;
+       }
+
        string const fname = onlyFileName(file.absFileName());
        LYXERR(Debug::LYXVC, "LyXVC: Checking if file is under git control for `"
                        << fname << '\'');
-       int const ret = doVCCommandCall("git log -n 0 " + quoteName(fname),
+       doVCCommandCall("git ls-files " +
+                       quoteName(fname) + " > " +
+                       quoteName(tmpf.toFilesystemEncoding()),
                        file.onlyPath());
-       bool const found = (ret == 0);
+       tmpf.refresh();
+       bool found = !tmpf.isFileEmpty();
        LYXERR(Debug::LYXVC, "GIT control: " << (found ? "enabled" : "disabled"));
        return found;
 }