ditch FileInfo -> use boost.filesystem

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@9547 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Lars Gullik Bjønnes 2005-01-31 10:42:26 +00:00
parent d9d7cbe23b
commit b6e6f87f71
37 changed files with 442 additions and 1133 deletions

View File

@ -1,7 +1,44 @@
2005-01-31 Lars Gullik Bjonnes <larsbj@gullik.net>
* vc-backend.C (find_file): rewrite to use boost.filesystem
(scanMaster): ditto
* main.C (main): sett default name check for boost.filesystem to
no check
* lyxfunc.C (menuNew): rewrite to use boost.filesystem
(open): ditto
(doImport): ditto
(actOnUpdatedPrefs): ditto
* lyx_main.C (init): rewrite to use boost.filesystem
(queryUserLyXDir): ditto
* lyx_cb.C (WriteAs): rewrite to use boost.filesystem
(getContentsOfAsciiFile): ditto
* lastfiles.C (readFile): rewrite to use boost.filesystem
* exporter.C (checkOverwrite): rewrite to use boost.filesystem
* buffer_funcs.C (readFile): rewrite to use boost.filesystem
(loadLyXFile): ditto
* buffer.C (Buffer): adjust for destroydir
(getLogName): rewrite to use boost.filesystem
(setFileName): ditto
(save): use fs::copy_file (from fs_extras)
* Makefile.am (BOOST_LIBS): add BOOST_FILESYSTEM
* LaTeX.C (run): rewrite to use boost.filesystem
(scanAuxFiles): ditto
(handleFoundFile): ditto
2005-01-28 Jürgen Spitzmüller <j.spitzmueller@gmx.de> 2005-01-28 Jürgen Spitzmüller <j.spitzmueller@gmx.de>
* LaTeXFeatures.C (getAvailable): always clear packages_ list. * LaTeXFeatures.C (getAvailable): always clear packages_ list.
* lyx_cb.C (Reconfigure): call LaTeXFeatures::getAvailable() * lyx_cb.C (Reconfigure): call LaTeXFeatures::getAvailable()
2005-01-27 Lars Gullik Bjonnes <larsbj@gullik.net> 2005-01-27 Lars Gullik Bjonnes <larsbj@gullik.net>

View File

@ -21,13 +21,13 @@
#include "debug.h" #include "debug.h"
#include "DepTable.h" #include "DepTable.h"
#include "support/filetools.h" #include "support/filetools.h"
#include "support/FileInfo.h"
#include "support/convert.h" #include "support/convert.h"
#include "support/lstrings.h" #include "support/lstrings.h"
#include "support/lyxlib.h" #include "support/lyxlib.h"
#include "support/systemcall.h" #include "support/systemcall.h"
#include "support/os.h" #include "support/os.h"
#include <boost/filesystem/operations.hpp>
#include <boost/regex.hpp> #include <boost/regex.hpp>
#include <fstream> #include <fstream>
@ -36,7 +36,6 @@ using lyx::support::AbsolutePath;
using lyx::support::bformat; using lyx::support::bformat;
using lyx::support::ChangeExtension; using lyx::support::ChangeExtension;
using lyx::support::contains; using lyx::support::contains;
using lyx::support::FileInfo;
using lyx::support::findtexfile; using lyx::support::findtexfile;
using lyx::support::getcwd; using lyx::support::getcwd;
using lyx::support::OnlyFilename; using lyx::support::OnlyFilename;
@ -51,6 +50,7 @@ using lyx::support::unlink;
using lyx::support::trim; using lyx::support::trim;
namespace os = lyx::support::os; namespace os = lyx::support::os;
namespace fs = boost::filesystem;
using boost::regex; using boost::regex;
using boost::smatch; using boost::smatch;
@ -197,8 +197,7 @@ int LaTeX::run(TeXErrors & terr)
// remake the dependency file. // remake the dependency file.
// //
FileInfo fi(depfile); bool had_depfile = fs::exists(depfile);
bool had_depfile = fi.exist();
bool run_bibtex = false; bool run_bibtex = false;
string aux_file = OnlyFilename(ChangeExtension(file, "aux")); string aux_file = OnlyFilename(ChangeExtension(file, "aux"));
@ -214,7 +213,7 @@ int LaTeX::run(TeXErrors & terr)
// Can't just check if anything has changed because it might have aborted // Can't just check if anything has changed because it might have aborted
// on error last time... in which cas we need to re-run latex // on error last time... in which cas we need to re-run latex
// and collect the error messages (even if they are the same). // and collect the error messages (even if they are the same).
if (!FileInfo(output_file).exist()) { if (!fs::exists(output_file)) {
lyxerr[Debug::DEPEND] lyxerr[Debug::DEPEND]
<< "re-running LaTeX because output file doesn't exist." << endl; << "re-running LaTeX because output file doesn't exist." << endl;
} else if (!head.sumchange()) { } else if (!head.sumchange()) {
@ -412,10 +411,10 @@ LaTeX::scanAuxFiles(string const & file)
result.push_back(scanAuxFile(file)); result.push_back(scanAuxFile(file));
for (int i = 1; i < 1000; ++i) { for (int i = 1; i < 1000; ++i) {
string file2 = ChangeExtension(file, "") + '.' + convert<string>(i) string const file2 = ChangeExtension(file, "")
+ '.' + convert<string>(i)
+ ".aux"; + ".aux";
FileInfo fi(file2); if (!fs::exists(file2))
if (!fi.exist())
break; break;
result.push_back(scanAuxFile(file2)); result.push_back(scanAuxFile(file2));
} }
@ -688,7 +687,7 @@ void handleFoundFile(string const & ff, DepTable & head)
// On initial insert we want to do the update at once // On initial insert we want to do the update at once
// since this file can not be a file generated by // since this file can not be a file generated by
// the latex run. // the latex run.
if (FileInfo(foundfile).exist()) if (fs::exists(foundfile))
head.insert(foundfile, true); head.insert(foundfile, true);
return; return;
@ -698,7 +697,7 @@ void handleFoundFile(string const & ff, DepTable & head)
// (2) foundfile is in the tmpdir // (2) foundfile is in the tmpdir
// insert it into head // insert it into head
if (FileInfo(onlyfile).exist()) { if (fs::exists(onlyfile)) {
static regex unwanted("^.*\\.(aux|log|dvi|bbl|ind|glo)$"); static regex unwanted("^.*\\.(aux|log|dvi|bbl|ind|glo)$");
if (regex_match(onlyfile, unwanted)) { if (regex_match(onlyfile, unwanted)) {
lyxerr[Debug::DEPEND] lyxerr[Debug::DEPEND]

View File

@ -20,7 +20,7 @@ LYX_POST_LIBS = frontends/controllers/libcontrollers.la \
graphics/libgraphics.la \ graphics/libgraphics.la \
support/libsupport.la support/libsupport.la
BOOST_LIBS = $(BOOST_REGEX) $(BOOST_SIGNALS) BOOST_LIBS = $(BOOST_REGEX) $(BOOST_SIGNALS) $(BOOST_FILESYSTEM)
OTHERLIBS = $(BOOST_LIBS) $(INTLLIBS) $(AIKSAURUS_LIBS) @LIBS@ OTHERLIBS = $(BOOST_LIBS) $(INTLLIBS) $(AIKSAURUS_LIBS) @LIBS@

View File

@ -63,8 +63,8 @@
#include "graphics/Previews.h" #include "graphics/Previews.h"
#include "support/FileInfo.h"
#include "support/filetools.h" #include "support/filetools.h"
#include "support/fs_extras.h"
#ifdef USE_COMPRESSION #ifdef USE_COMPRESSION
# include "support/gzstream.h" # include "support/gzstream.h"
#endif #endif
@ -75,6 +75,7 @@
#include "support/convert.h" #include "support/convert.h"
#include <boost/bind.hpp> #include <boost/bind.hpp>
#include <boost/filesystem/operations.hpp>
#include <utime.h> #include <utime.h>
@ -93,11 +94,8 @@ using lyx::support::ChangeExtension;
using lyx::support::cmd_ret; using lyx::support::cmd_ret;
using lyx::support::createBufferTmpDir; using lyx::support::createBufferTmpDir;
using lyx::support::destroyDir; using lyx::support::destroyDir;
using lyx::support::FileInfo;
using lyx::support::FileInfo;
using lyx::support::getFormatFromContents; using lyx::support::getFormatFromContents;
using lyx::support::IsDirWriteable; using lyx::support::IsDirWriteable;
using lyx::support::IsFileWriteable;
using lyx::support::LibFileSearch; using lyx::support::LibFileSearch;
using lyx::support::ltrim; using lyx::support::ltrim;
using lyx::support::MakeAbsPath; using lyx::support::MakeAbsPath;
@ -116,6 +114,7 @@ using lyx::support::tempName;
using lyx::support::trim; using lyx::support::trim;
namespace os = lyx::support::os; namespace os = lyx::support::os;
namespace fs = boost::filesystem;
using std::endl; using std::endl;
using std::for_each; using std::for_each;
@ -222,7 +221,7 @@ Buffer::~Buffer()
closing(); closing();
if (!temppath().empty() && destroyDir(temppath()) != 0) { if (!temppath().empty() && !destroyDir(temppath())) {
Alert::warning(_("Could not remove temporary directory"), Alert::warning(_("Could not remove temporary directory"),
bformat(_("Could not remove the temporary directory %1$s"), temppath())); bformat(_("Could not remove the temporary directory %1$s"), temppath()));
} }
@ -348,11 +347,8 @@ pair<Buffer::LogType, string> const Buffer::getLogName() const
// If no Latex log or Build log is newer, show Build log // If no Latex log or Build log is newer, show Build log
FileInfo const f_fi(fname); if (fs::exists(bname) &&
FileInfo const b_fi(bname); (!fs::exists(fname) || fs::last_write_time(fname) < fs::last_write_time(bname))) {
if (b_fi.exist() &&
(!f_fi.exist() || f_fi.getModificationTime() < b_fi.getModificationTime())) {
lyxerr[Debug::FILES] << "Log name calculated as: " << bname << endl; lyxerr[Debug::FILES] << "Log name calculated as: " << bname << endl;
return make_pair(Buffer::buildlog, bname); return make_pair(Buffer::buildlog, bname);
} }
@ -374,7 +370,7 @@ void Buffer::setFileName(string const & newfile)
{ {
pimpl_->filename = MakeAbsPath(newfile); pimpl_->filename = MakeAbsPath(newfile);
pimpl_->filepath = OnlyPath(pimpl_->filename); pimpl_->filepath = OnlyPath(pimpl_->filename);
setReadonly(IsFileWriteable(pimpl_->filename) == 0); setReadonly(fs::is_readonly(pimpl_->filename));
updateTitles(); updateTitles();
} }
@ -687,51 +683,18 @@ bool Buffer::save() const
s = AddName(lyxrc.backupdir_path, s = AddName(lyxrc.backupdir_path,
subst(os::internal_path(s),'/','!')); subst(os::internal_path(s),'/','!'));
// Rename is the wrong way of making a backup, // It might very well be that this variant is just
// this is the correct way. // good enough. (Lgb)
/* truss cp fil fil2: // But to use this we need fs::copy_file to actually do a copy,
lstat("LyXVC3.lyx", 0xEFFFF898) Err#2 ENOENT // even when the target file exists. (Lgb)
stat("LyXVC.lyx", 0xEFFFF688) = 0 if (fs::exists(fileName())) {
open("LyXVC.lyx", O_RDONLY) = 3 //try {
open("LyXVC3.lyx", O_WRONLY|O_CREAT|O_TRUNC, 0600) = 4 fs::copy_file(fileName(), s, false);
fstat(4, 0xEFFFF508) = 0 //}
fstat(3, 0xEFFFF508) = 0 //catch (fs::filesystem_error const & fe) {
read(3, " # T h i s f i l e w".., 8192) = 5579 //lyxerr << "LyX was not able to make backup copy. Beware.\n"
write(4, " # T h i s f i l e w".., 5579) = 5579 // << fe.what() << endl;
read(3, 0xEFFFD4A0, 8192) = 0 //}
close(4) = 0
close(3) = 0
chmod("LyXVC3.lyx", 0100644) = 0
lseek(0, 0, SEEK_CUR) = 46440
_exit(0)
*/
// Should probably have some more error checking here.
// Doing it this way, also makes the inodes stay the same.
// This is still not a very good solution, in particular we
// might loose the owner of the backup.
FileInfo finfo(fileName());
if (finfo.exist()) {
mode_t fmode = finfo.getMode();
struct utimbuf times = {
finfo.getAccessTime(),
finfo.getModificationTime() };
ifstream ifs(fileName().c_str());
ofstream ofs(s.c_str(), ios::out|ios::trunc);
if (ifs && ofs) {
ofs << ifs.rdbuf();
ifs.close();
ofs.close();
::chmod(s.c_str(), fmode);
if (::utime(s.c_str(), &times)) {
lyxerr << "utime error." << endl;
}
} else {
lyxerr << "LyX was not able to make "
"backup copy. Beware." << endl;
}
} }
} }
@ -753,15 +716,11 @@ bool Buffer::writeFile(string const & fname) const
if (pimpl_->read_only && fname == fileName()) if (pimpl_->read_only && fname == fileName())
return false; return false;
FileInfo finfo(fname);
if (finfo.exist() && !finfo.writable())
return false;
bool retval = false; bool retval = false;
if (params().compressed) { if (params().compressed) {
#ifdef USE_COMPRESSION #ifdef USE_COMPRESSION
gz::ogzstream ofs(fname.c_str()); gz::ogzstream ofs(fname.c_str(), ios::out|ios::trunc);
if (!ofs) if (!ofs)
return false; return false;
@ -770,7 +729,7 @@ bool Buffer::writeFile(string const & fname) const
return false; return false;
#endif #endif
} else { } else {
ofstream ofs(fname.c_str()); ofstream ofs(fname.c_str(), ios::out|ios::trunc);
if (!ofs) if (!ofs)
return false; return false;

View File

@ -28,15 +28,14 @@
#include "frontends/Alert.h" #include "frontends/Alert.h"
#include "support/FileInfo.h"
#include "support/filetools.h" #include "support/filetools.h"
#include "support/fs_extras.h"
#include "support/lyxlib.h" #include "support/lyxlib.h"
#include <boost/bind.hpp> #include <boost/bind.hpp>
#include <boost/filesystem/operations.hpp>
using lyx::support::bformat; using lyx::support::bformat;
using lyx::support::FileInfo;
using lyx::support::IsFileWriteable;
using lyx::support::LibFileSearch; using lyx::support::LibFileSearch;
using lyx::support::MakeDisplayPath; using lyx::support::MakeDisplayPath;
using lyx::support::OnlyFilename; using lyx::support::OnlyFilename;
@ -45,6 +44,7 @@ using lyx::support::unlink;
using std::string; using std::string;
namespace fs = boost::filesystem;
extern BufferList bufferlist; extern BufferList bufferlist;
@ -55,8 +55,7 @@ bool readFile(Buffer * const b, string const & s)
BOOST_ASSERT(b); BOOST_ASSERT(b);
// File information about normal file // File information about normal file
FileInfo fileN(s); if (!fs::exists(s)) {
if (!fileN.exist()) {
string const file = MakeDisplayPath(s, 50); string const file = MakeDisplayPath(s, 50);
string text = bformat(_("The specified document\n%1$s" string text = bformat(_("The specified document\n%1$s"
"\ncould not be read."), file); "\ncould not be read."), file);
@ -66,10 +65,9 @@ bool readFile(Buffer * const b, string const & s)
// Check if emergency save file exists and is newer. // Check if emergency save file exists and is newer.
string const e = OnlyPath(s) + OnlyFilename(s) + ".emergency"; string const e = OnlyPath(s) + OnlyFilename(s) + ".emergency";
FileInfo fileE(e);
if (fileE.exist() && fileN.exist() if (fs::exists(e) && fs::exists(s)
&& fileE.getModificationTime() > fileN.getModificationTime()) && fs::last_write_time(e) > fs::last_write_time(s))
{ {
string const file = MakeDisplayPath(s, 20); string const file = MakeDisplayPath(s, 20);
string const text = string const text =
@ -93,10 +91,9 @@ bool readFile(Buffer * const b, string const & s)
// Now check if autosave file is newer. // Now check if autosave file is newer.
string const a = OnlyPath(s) + '#' + OnlyFilename(s) + '#'; string const a = OnlyPath(s) + '#' + OnlyFilename(s) + '#';
FileInfo fileA(a);
if (fileA.exist() && fileN.exist() if (fs::exists(a) && fs::exists(s)
&& fileA.getModificationTime() > fileN.getModificationTime()) && fs::last_write_time(a) > fs::last_write_time(s))
{ {
string const file = MakeDisplayPath(s, 20); string const file = MakeDisplayPath(s, 20);
string const text = string const text =
@ -131,17 +128,14 @@ bool loadLyXFile(Buffer * b, string const & s)
{ {
BOOST_ASSERT(b); BOOST_ASSERT(b);
switch (IsFileWriteable(s)) { if (fs::is_readable(s)) {
case 0:
b->setReadonly(true);
// Fall through
case 1:
if (readFile(b, s)) { if (readFile(b, s)) {
b->lyxvc().file_found_hook(s); b->lyxvc().file_found_hook(s);
if (!fs::is_writable(s))
b->setReadonly(true);
return true; return true;
} }
break; } else {
case -1:
string const file = MakeDisplayPath(s, 20); string const file = MakeDisplayPath(s, 20);
// Here we probably should run // Here we probably should run
if (LyXVC::file_not_found_hook(s)) { if (LyXVC::file_not_found_hook(s)) {
@ -159,7 +153,6 @@ bool loadLyXFile(Buffer * b, string const & s)
return loadLyXFile(b, s); return loadLyXFile(b, s);
} }
} }
break;
} }
return false; return false;
} }

View File

@ -30,11 +30,12 @@
#include "outputparams.h" #include "outputparams.h"
#include "frontends/Alert.h" #include "frontends/Alert.h"
#include "support/FileInfo.h"
#include "support/filetools.h" #include "support/filetools.h"
#include "support/lyxlib.h" #include "support/lyxlib.h"
#include "support/package.h" #include "support/package.h"
#include <boost/filesystem/operations.hpp>
using lyx::support::AddName; using lyx::support::AddName;
using lyx::support::bformat; using lyx::support::bformat;
using lyx::support::ChangeExtension; using lyx::support::ChangeExtension;
@ -50,6 +51,7 @@ using std::find;
using std::string; using std::string;
using std::vector; using std::vector;
namespace fs = boost::filesystem;
namespace { namespace {
@ -66,7 +68,7 @@ vector<string> const Backends(Buffer const & buffer)
/// ask the user what to do if a file already exists /// ask the user what to do if a file already exists
int checkOverwrite(string const & filename) int checkOverwrite(string const & filename)
{ {
if (lyx::support::FileInfo(filename, true).exist()) { if (fs::exists(filename)) {
string text = bformat(_("The file %1$s already exists.\n\n" string text = bformat(_("The file %1$s already exists.\n\n"
"Do you want to over-write that file?"), "Do you want to over-write that file?"),
MakeDisplayPath(filename)); MakeDisplayPath(filename));

View File

@ -1,3 +1,7 @@
2005-01-31 Lars Gullik Bjonnes <larsbj@gullik.net>
* ControlGraphics.C (browse): rewrite to use boost.filesystem
2005-01-20 Angus Leeming <leeming@lyx.org> 2005-01-20 Angus Leeming <leeming@lyx.org>
* ControlSpellchecker.C (check): s/IGNORE/IGNORED_WORD/. * ControlSpellchecker.C (check): s/IGNORE/IGNORED_WORD/.

View File

@ -26,22 +26,24 @@
#include "insets/insetgraphics.h" #include "insets/insetgraphics.h"
#include "support/convert.h" #include "support/convert.h"
#include "support/FileInfo.h"
#include "support/filefilterlist.h" #include "support/filefilterlist.h"
#include "support/filetools.h" #include "support/filetools.h"
#include "support/package.h" #include "support/package.h"
#include "support/types.h" #include "support/types.h"
#include <boost/filesystem/operations.hpp>
using std::make_pair; using std::make_pair;
using std::string; using std::string;
using std::pair; using std::pair;
using std::vector; using std::vector;
namespace fs = boost::filesystem;
namespace lyx { namespace lyx {
using support::AddName; using support::AddName;
using support::FileFilterList; using support::FileFilterList;
using support::FileInfo;
using support::IsFileReadable; using support::IsFileReadable;
using support::MakeAbsPath; using support::MakeAbsPath;
using support::package; using support::package;
@ -85,8 +87,7 @@ string const ControlGraphics::browse(string const & in_name) const
// Does user clipart directory exist? // Does user clipart directory exist?
string clipdir = AddName (package().user_support(), "clipart"); string clipdir = AddName (package().user_support(), "clipart");
FileInfo fileInfo(clipdir); if (!(fs::exists(clipdir) && fs::is_directory(clipdir)))
if (!(fileInfo.isOK() && fileInfo.isDir()))
// No - bail out to system clipart directory // No - bail out to system clipart directory
clipdir = AddName (package().system_support(), "clipart"); clipdir = AddName (package().system_support(), "clipart");
pair<string, string> dir1(_("Clipart|#C#c"), clipdir); pair<string, string> dir1(_("Clipart|#C#c"), clipdir);

View File

@ -1,3 +1,10 @@
2005-01-31 Lars Gullik Bjonnes <larsbj@gullik.net>
* xforms_helpers.C: rewrite to use boost.filesystem
* FormFiledialog.[Ch]: simplify and rewrite to use boost.filesystem,
remove lot of now unused code.
2005-01-27 Lars Gullik Bjonnes <larsbj@gullik.net> 2005-01-27 Lars Gullik Bjonnes <larsbj@gullik.net>
* Several files: use convert<> instead of atoi,strToXXX and friends * Several files: use convert<> instead of atoi,strToXXX and friends

View File

@ -19,8 +19,6 @@
#include "frontends/Dialogs.h" #include "frontends/Dialogs.h"
#include "support/convert.h"
#include "support/FileInfo.h"
#include "support/filefilterlist.h" #include "support/filefilterlist.h"
#include "support/filetools.h" #include "support/filetools.h"
#include "support/globbing.h" #include "support/globbing.h"
@ -31,47 +29,21 @@
#include "lyx_forms.h" #include "lyx_forms.h"
#include <boost/bind.hpp> #include <boost/bind.hpp>
#include <boost/regex.hpp> #include <boost/filesystem/operations.hpp>
#include <boost/tokenizer.hpp> #include <boost/tokenizer.hpp>
#include <algorithm> #include <algorithm>
#include <map>
#include <sstream> #include <sstream>
#include <grp.h>
#include <pwd.h>
//#ifdef HAVE_ERRNO_H
//#include <cerrno>
//#endif
#if HAVE_DIRENT_H
# include <dirent.h>
#else
# define dirent direct
# if HAVE_SYS_NDIR_H
# include <sys/ndir.h>
# endif
# if HAVE_SYS_DIR_H
# include <sys/dir.h>
# endif
# if HAVE_NDIR_H
# include <ndir.h>
# endif
#endif
using lyx::support::AbsolutePath; using lyx::support::AbsolutePath;
using lyx::support::AddName; using lyx::support::AddName;
using lyx::support::ExpandPath; using lyx::support::ExpandPath;
using lyx::support::FileFilterList; using lyx::support::FileFilterList;
using lyx::support::FileInfo;
using lyx::support::getcwd; using lyx::support::getcwd;
using lyx::support::LyXReadLink;
using lyx::support::MakeAbsPath; using lyx::support::MakeAbsPath;
using lyx::support::OnlyFilename; using lyx::support::OnlyFilename;
using lyx::support::package; using lyx::support::package;
using lyx::support::split; using lyx::support::split;
using lyx::support::subst;
using lyx::support::suffixIs; using lyx::support::suffixIs;
using lyx::support::trim; using lyx::support::trim;
@ -79,11 +51,10 @@ using std::max;
using std::sort; using std::sort;
using std::ostringstream; using std::ostringstream;
using std::string; using std::string;
using std::map;
using std::vector; using std::vector;
using namespace lyx::frontend; using namespace lyx::frontend;
namespace fs = boost::filesystem;
namespace { namespace {
@ -114,11 +85,6 @@ vector<string> const expand_globs(string const & mask,
} }
// six months, in seconds
long const SIX_MONTH_SEC = 6L * 30L * 24L * 60L * 60L;
//static
long const ONE_HOUR_SEC = 60L * 60L;
extern "C" { extern "C" {
static static
@ -141,72 +107,6 @@ extern "C" {
} }
// *** User cache class implementation
/// User cache class definition
class UserCache {
public:
/// seeks user name from group ID
string const & find(uid_t ID) const {
Users::const_iterator cit = users.find(ID);
if (cit == users.end()) {
add(ID);
return users[ID];
}
return cit->second;
}
private:
///
void add(uid_t ID) const;
///
typedef map<uid_t, string> Users;
///
mutable Users users;
};
void UserCache::add(uid_t ID) const
{
struct passwd const * entry = getpwuid(ID);
users[ID] = entry ? entry->pw_name : convert<string>(int(ID));
}
/// Group cache class definition
class GroupCache {
public:
/// seeks group name from group ID
string const & find(gid_t ID) const ;
private:
///
void add(gid_t ID) const;
///
typedef map<gid_t, string> Groups;
///
mutable Groups groups;
};
string const & GroupCache::find(gid_t ID) const
{
Groups::const_iterator cit = groups.find(ID);
if (cit == groups.end()) {
add(ID);
return groups[ID];
}
return cit->second;
}
void GroupCache::add(gid_t ID) const
{
struct group const * entry = getgrgid(ID);
groups[ID] = entry ? entry->gr_name : convert<string>(int(ID));
}
// local instances
UserCache lyxUserCache;
GroupCache lyxGroupCache;
// compares two LyXDirEntry objects content (used for sort) // compares two LyXDirEntry objects content (used for sort)
class comp_direntry : public std::binary_function<DirEntry, DirEntry, bool> { class comp_direntry : public std::binary_function<DirEntry, DirEntry, bool> {
@ -240,15 +140,13 @@ int FileDialog::Private::minh_ = 0;
void FileDialog::Private::Reread() void FileDialog::Private::Reread()
{ {
// Opens directory // Opens directory
DIR * dir = ::opendir(directory_.c_str()); if (!fs::exists(directory_) || !fs::is_directory(directory_)) {
if (!dir) {
// FIXME: re-add ... // FIXME: re-add ...
#if 0 #if 0
Alert::err_alert(_("Warning! Couldn't open directory."), Alert::err_alert(_("Warning! Couldn't open directory."),
directory_); directory_);
#endif #endif
directory_ = getcwd(); directory_ = getcwd();
dir = ::opendir(directory_.c_str());
} }
// Clear the present namelist // Clear the present namelist
@ -261,14 +159,14 @@ void FileDialog::Private::Reread()
// Splits complete directory name into directories and compute depth // Splits complete directory name into directories and compute depth
depth_ = 0; depth_ = 0;
string line, Temp; string line;
string mode; string Temp;
string File = directory_; string File = directory_;
if (File != "/") if (File != "/")
File = split(File, Temp, '/'); File = split(File, Temp, '/');
while (!File.empty() || !Temp.empty()) { while (!File.empty() || !Temp.empty()) {
string dline = "@b" + line + Temp + '/'; string const dline = "@b" + line + Temp + '/';
fl_add_browser_line(file_dlg_form_->List, dline.c_str()); fl_add_browser_line(file_dlg_form_->List, dline.c_str());
File = split(File, Temp, '/'); File = split(File, Temp, '/');
line += ' '; line += ' ';
@ -277,118 +175,37 @@ void FileDialog::Private::Reread()
vector<string> const glob_matches = expand_globs(mask_, directory_); vector<string> const glob_matches = expand_globs(mask_, directory_);
time_t curTime = time(0); fs::directory_iterator beg(directory_);
rewinddir(dir); fs::directory_iterator end;
while (dirent * entry = readdir(dir)) { for (; beg != end; ++beg) {
bool isLink = false, isDir = false; string const fname = beg->leaf();
// If the pattern doesn't start with a dot, skip hidden files // If the pattern doesn't start with a dot, skip hidden files
if (!mask_.empty() && mask_[0] != '.' && if (!mask_.empty() && mask_[0] != '.' && fname[0] == '.')
entry->d_name[0] == '.')
continue; continue;
// Gets filename bool const isDir = fs::is_directory(*beg);
string fname = entry->d_name;
// Under all circumstances, "." and ".." are not wanted
if (fname == "." || fname == "..")
continue;
// gets file status
File = AddName(directory_, fname);
FileInfo fileInfo(File, true);
// can this really happen?
if (!fileInfo.isOK())
continue;
mode = fileInfo.modeString();
string const user = lyxUserCache.find(fileInfo.getUid());
string const group = lyxGroupCache.find(fileInfo.getGid());
time_t modtime = fileInfo.getModificationTime();
string Time = ctime(&modtime);
if (curTime > modtime + SIX_MONTH_SEC
|| curTime < modtime + ONE_HOUR_SEC) {
// The file is fairly old or in the future. POSIX says
// the cutoff is 6 months old. Allow a 1 hour slop
// factor for what is considered "the future", to
// allow for NFS server/client clock disagreement.
// Show the year instead of the time of day.
Time.erase(10, 9);
Time.erase(15, string::npos);
} else {
Time.erase(16, string::npos);
}
string buffer = mode + ' ' +
user + ' ' +
group + ' ' +
Time.substr(4, string::npos) + ' ';
buffer += entry->d_name;
buffer += fileInfo.typeIndicator();
isLink = fileInfo.isLink();
if (isLink) {
string Link;
if (LyXReadLink(File, Link)) {
buffer += " -> ";
buffer += Link;
// This gives the FileType of the file that
// is really pointed to after resolving all
// symlinks. This is not necessarily the same
// as the type of Link (which could again be a
// link). Is that intended?
// JV 199902
fileInfo.newFile(File);
if (fileInfo.isOK())
buffer += fileInfo.typeIndicator();
else
continue;
}
}
// filters files according to pattern and type // filters files according to pattern and type
if (fileInfo.isRegular()
|| fileInfo.isChar()
|| fileInfo.isBlock()
|| fileInfo.isFifo()) {
typedef vector<string>::const_iterator viterator; typedef vector<string>::const_iterator viterator;
viterator gbegin = glob_matches.begin(); viterator gbegin = glob_matches.begin();
viterator const gend = glob_matches.end(); viterator const gend = glob_matches.end();
if (std::find(gbegin, gend, fname) == gend)
continue; if (!isDir && std::find(gbegin, gend, fname) == gend)
} else if (!(isDir = fileInfo.isDir()))
continue; continue;
DirEntry tmp; DirEntry tmp;
// Note ls_entry_ is an string!
tmp.ls_entry_ = buffer;
// creates used name // creates used name
string temp = fname; tmp.name_ = fname;
if (isDir) if (isDir)
temp += '/'; tmp.name_ += '/';
tmp.name_ = temp;
// creates displayed name // creates displayed name
temp = entry->d_name; tmp.displayed_ = fname;
if (isLink)
temp += '@';
else
temp += fileInfo.typeIndicator();
tmp.displayed_ = temp;
dir_entries_.push_back(tmp); dir_entries_.push_back(tmp);
} }
closedir(dir);
// Sort the names // Sort the names
sort(dir_entries_.begin(), dir_entries_.end(), comp_direntry()); sort(dir_entries_.begin(), dir_entries_.end(), comp_direntry());
@ -414,14 +231,12 @@ void FileDialog::Private::SetDirectory(string const & path)
tmp = MakeAbsPath(ExpandPath(path), directory_); tmp = MakeAbsPath(ExpandPath(path), directory_);
// must check the directory exists // must check the directory exists
DIR * dir = ::opendir(tmp.c_str()); if (!fs::exists(tmp) || !fs::is_directory(tmp)) {
if (!dir) {
// FIXME: re-add ... // FIXME: re-add ...
#if 0 #if 0
Alert::err_alert(_("Warning! Couldn't open directory."), tmp); Alert::err_alert(_("Warning! Couldn't open directory."), tmp);
#endif #endif
} else { } else {
::closedir(dir);
directory_ = tmp; directory_ = tmp;
} }
} }
@ -457,14 +272,6 @@ void FileDialog::Private::SetFilters(FileFilterList const & filters)
} }
// SetInfoLine: sets dialog information line
void FileDialog::Private::SetInfoLine(string const & line)
{
info_line_ = line;
fl_set_object_label(file_dlg_form_->FileInfo, info_line_.c_str());
}
FileDialog::Private::Private() FileDialog::Private::Private()
{ {
directory_ = MakeAbsPath(string(".")); directory_ = MakeAbsPath(string("."));
@ -644,10 +451,12 @@ void FileDialog::Private::HandleListHit()
{ {
// set info line // set info line
int const select_ = fl_get_browser(file_dlg_form_->List); int const select_ = fl_get_browser(file_dlg_form_->List);
if (select_ > depth_) string line = (select_ > depth_ ?
SetInfoLine(dir_entries_[select_ - depth_ - 1].ls_entry_); dir_entries_[select_ - depth_ - 1].name_ :
else string());
SetInfoLine(string()); if (suffixIs(line, '/'))
line.clear();
fl_set_input(file_dlg_form_->Filename, line.c_str());
} }
@ -670,14 +479,11 @@ bool FileDialog::Private::HandleDoubleClick()
int const select_ = fl_get_browser(file_dlg_form_->List); int const select_ = fl_get_browser(file_dlg_form_->List);
if (select_ > depth_) { if (select_ > depth_) {
tmp = dir_entries_[select_ - depth_ - 1].name_; tmp = dir_entries_[select_ - depth_ - 1].name_;
SetInfoLine(dir_entries_[select_ - depth_ - 1].ls_entry_);
if (!suffixIs(tmp, '/')) { if (!suffixIs(tmp, '/')) {
isDir = false; isDir = false;
fl_set_input(file_dlg_form_->Filename, tmp.c_str()); fl_set_input(file_dlg_form_->Filename, tmp.c_str());
} }
} else if (select_ != 0) { } else if (select_ == 0)
SetInfoLine(string());
} else
return true; return true;
// executes action // executes action
@ -696,7 +502,7 @@ bool FileDialog::Private::HandleDoubleClick()
// Directory higher up // Directory higher up
Temp.erase(); Temp.erase();
for (int i = 0; i < select_; ++i) { for (int i = 0; i < select_; ++i) {
string piece = fl_get_browser_line(file_dlg_form_->List, i+1); string const piece = fl_get_browser_line(file_dlg_form_->List, i + 1);
// The '+2' is here to count the '@b' (JMarc) // The '+2' is here to count the '@b' (JMarc)
Temp += piece.substr(i + 2); Temp += piece.substr(i + 2);
} }
@ -808,7 +614,6 @@ string const FileDialog::Private::Select(string const & title,
current_dlg_ = this; current_dlg_ = this;
// runs dialog // runs dialog
SetInfoLine(string());
setEnabled(file_dlg_form_->Filename, true); setEnabled(file_dlg_form_->Filename, true);
fl_set_input(file_dlg_form_->Filename, suggested.c_str()); fl_set_input(file_dlg_form_->Filename, suggested.c_str());
fl_set_button(file_dlg_form_->Cancel, 0); fl_set_button(file_dlg_form_->Cancel, 0);
@ -858,11 +663,10 @@ string const FileDialog::Private::SelectDir(string const & title,
string tmp = suggested; string tmp = suggested;
if (!suffixIs(tmp, '/')) if (!suffixIs(tmp, '/'))
tmp += '/'; tmp += '/';
string full_path = path; string const full_path = path + tmp;
full_path += tmp;
// check if this is really a directory // check if this is really a directory
DIR * dir = ::opendir(full_path.c_str()); if (fs::exists(full_path)
if (dir) && fs::is_directory(full_path))
SetDirectory(full_path); SetDirectory(full_path);
else else
SetDirectory(path); SetDirectory(path);
@ -879,7 +683,6 @@ string const FileDialog::Private::SelectDir(string const & title,
current_dlg_ = this; current_dlg_ = this;
// runs dialog // runs dialog
SetInfoLine(string());
fl_set_input(file_dlg_form_->Filename, ""); fl_set_input(file_dlg_form_->Filename, "");
setEnabled(file_dlg_form_->Filename, false); setEnabled(file_dlg_form_->Filename, false);
fl_set_button(file_dlg_form_->Cancel, 0); fl_set_button(file_dlg_form_->Cancel, 0);

View File

@ -43,8 +43,6 @@ public:
std::string name_; std::string name_;
/// ///
std::string displayed_; std::string displayed_;
///
std::string ls_entry_;
}; };
@ -115,8 +113,6 @@ private:
/// ///
long last_time_; long last_time_;
/// ///
std::string info_line_;
///
typedef std::vector<lyx::frontend::DirEntry> DirEntries; typedef std::vector<lyx::frontend::DirEntry> DirEntries;
/// ///
DirEntries dir_entries_; DirEntries dir_entries_;
@ -136,8 +132,6 @@ private:
/// sets dialog file mask /// sets dialog file mask
void SetFilters(std::string const & filters); void SetFilters(std::string const & filters);
void SetFilters(lyx::support::FileFilterList const & filters); void SetFilters(lyx::support::FileFilterList const & filters);
/// sets dialog information line
void SetInfoLine(std::string const & pszLine);
/// handle dialog during file selection /// handle dialog during file selection
bool RunDialog(); bool RunDialog();
/// Handle callback from list /// Handle callback from list

View File

@ -18,15 +18,16 @@
#include "lyxgluelength.h" #include "lyxgluelength.h"
#include "lyxlex.h" #include "lyxlex.h"
#include "support/FileInfo.h"
#include "support/filetools.h" #include "support/filetools.h"
#include "support/lstrings.h" // frontStrip, strip #include "support/lstrings.h" // frontStrip, strip
#include "support/convert.h" #include "support/convert.h"
#include "support/fs_extras.h"
#include "lyx_forms.h" #include "lyx_forms.h"
#include "combox.h" #include "combox.h"
#include <boost/assert.hpp> #include <boost/assert.hpp>
#include <boost/filesystem/operations.hpp>
#include <fstream> #include <fstream>
@ -36,10 +37,11 @@ using std::ofstream;
using std::vector; using std::vector;
using std::string; using std::string;
namespace fs = boost::filesystem;
namespace lyx { namespace lyx {
using support::AbsolutePath; using support::AbsolutePath;
using support::FileInfo;
using support::isStrDbl; using support::isStrDbl;
using support::OnlyPath; using support::OnlyPath;
using support::subst; using support::subst;
@ -336,9 +338,8 @@ const int xformCount = sizeof(xformTags) / sizeof(keyword_item);
bool XformsColor::read(string const & filename) bool XformsColor::read(string const & filename)
{ {
FileInfo const f(filename);
LyXLex lexrc(xformTags, xformCount); LyXLex lexrc(xformTags, xformCount);
if (f.readable() && !lexrc.setFile(filename)) { if (fs::is_readable(filename) && !lexrc.setFile(filename)) {
lyxerr << "XformsColor::read(" << filename << ")\n" lyxerr << "XformsColor::read(" << filename << ")\n"
<< _("Failed to open file.") << std::endl; << _("Failed to open file.") << std::endl;
return false; return false;
@ -421,13 +422,12 @@ bool RWInfo::WriteableDir(string const & name)
return false; return false;
} }
FileInfo const tp(name); if (!fs::exists(name) || !fs::is_directory(name)) {
if (!tp.isOK() || !tp.isDir()) {
error_message = _("Directory does not exist."); error_message = _("Directory does not exist.");
return false; return false;
} }
if (!tp.writable()) { if (!fs::is_writable(name)) {
error_message = _("Cannot write to this directory."); error_message = _("Cannot write to this directory.");
return false; return false;
} }
@ -445,13 +445,12 @@ bool RWInfo::ReadableDir(string const & name)
return false; return false;
} }
FileInfo const tp(name); if (!fs::exists(name) || !fs::is_directory(name)) {
if (!tp.isOK() || !tp.isDir()) {
error_message = _("Directory does not exist."); error_message = _("Directory does not exist.");
return false; return false;
} }
if (!tp.readable()) { if (!fs::is_readable(name)) {
error_message = _("Cannot read this directory."); error_message = _("Cannot read this directory.");
return false; return false;
} }
@ -480,29 +479,28 @@ bool RWInfo::WriteableFile(string const & name)
return false; return false;
} }
FileInfo d(name); string checkFile = name;
if (!d.isOK() || !d.isDir()) { if (!fs::exists(checkFile) || !fs::is_directory(checkFile)) {
d.newFile(dir); checkFile = dir;
} }
if (!d.isOK() || !d.isDir()) { if (!fs::exists(checkFile) || !fs::is_directory(checkFile)) {
error_message = _("Directory does not exist."); error_message = _("Directory does not exists.");
return false; return false;
} }
if (!d.writable()) { if (!fs::is_writable(checkFile)) {
error_message = _("Cannot write to this directory."); error_message = _("Cannot write to this directory.");
return false; return false;
} }
FileInfo f(name); if (dir == name || (fs::exists(name) && fs::is_directory(name))) {
if (dir == name || (f.isOK() && f.isDir())) {
error_message = _("A file is required, not a directory."); error_message = _("A file is required, not a directory.");
return false; return false;
} }
if (f.isOK() && f.exist() && !f.writable()) { if (fs::exists(name) && !fs::is_writable(name)) {
error_message = _("Cannot write to this file."); error_message = _("Cannot write to this file.");
return false; return false;
} }
@ -526,34 +524,33 @@ bool RWInfo::ReadableFile(string const & name)
return false; return false;
} }
FileInfo d(name); string checkFile = name;
if (!d.isOK() && !d.isDir()) { if (!fs::exists(checkFile) && !fs::is_directory(checkFile)) {
d.newFile(dir); checkFile = dir;
} }
if (!d.isOK() || !d.isDir()) { if (!fs::exists(checkFile) || !fs::is_directory(checkFile)) {
error_message = _("Directory does not exist."); error_message = _("Directory does not exist.");
return false; return false;
} }
if (!d.readable()) { if (!fs::is_readable(checkFile)) {
error_message = _("Cannot read from this directory."); error_message = _("Cannot read from this directory.");
return false; return false;
} }
FileInfo f(name); if (dir == name || (fs::exists(name) && fs::is_directory(name))) {
if (dir == name || (f.isOK() && f.isDir())) {
error_message = _("A file is required, not a directory."); error_message = _("A file is required, not a directory.");
return false; return false;
} }
if (!f.exist()) { if (!fs::exists(name)) {
error_message = _("File does not exist."); error_message = _("File does not exist.");
return false; return false;
} }
if (!f.readable()) { if (!fs::is_readable(name)) {
error_message = _("Cannot read from this file."); error_message = _("Cannot read from this file.");
return false; return false;
} }

View File

@ -1,3 +1,7 @@
2005-01-31 Lars Gullik Bjonnes <larsbj@gullik.net>
* insetinclude.C (loadIfNeeded): rewrite to use boost.filesystem
2005-01-31 Angus Leeming <leeming@lyx.org> 2005-01-31 Angus Leeming <leeming@lyx.org>
* insetgraphicsParams.C: protect a #warning preprocessor call * insetgraphicsParams.C: protect a #warning preprocessor call

View File

@ -37,7 +37,6 @@
#include "graphics/PreviewLoader.h" #include "graphics/PreviewLoader.h"
#include "support/FileInfo.h"
#include "support/filetools.h" #include "support/filetools.h"
#include "support/lstrings.h" #include "support/lstrings.h"
#include "support/lyxlib.h" #include "support/lyxlib.h"

View File

@ -39,7 +39,6 @@
#include "insets/render_preview.h" #include "insets/render_preview.h"
#include "support/FileInfo.h"
#include "support/filename.h" #include "support/filename.h"
#include "support/filetools.h" #include "support/filetools.h"
#include "support/lstrings.h" // contains #include "support/lstrings.h" // contains
@ -47,6 +46,7 @@
#include "support/convert.h" #include "support/convert.h"
#include <boost/bind.hpp> #include <boost/bind.hpp>
#include <boost/filesystem/operations.hpp>
#include "support/std_ostream.h" #include "support/std_ostream.h"
@ -58,7 +58,6 @@ using lyx::support::bformat;
using lyx::support::ChangeExtension; using lyx::support::ChangeExtension;
using lyx::support::contains; using lyx::support::contains;
using lyx::support::copy; using lyx::support::copy;
using lyx::support::FileInfo;
using lyx::support::FileName; using lyx::support::FileName;
using lyx::support::GetFileContents; using lyx::support::GetFileContents;
using lyx::support::IsFileReadable; using lyx::support::IsFileReadable;
@ -78,6 +77,7 @@ using std::istringstream;
using std::ostream; using std::ostream;
using std::ostringstream; using std::ostringstream;
namespace fs = boost::filesystem;
extern BufferList bufferlist; extern BufferList bufferlist;
@ -294,8 +294,7 @@ bool loadIfNeeded(Buffer const & buffer, InsetCommandParams const & params)
Buffer * buf = bufferlist.getBuffer(included_file); Buffer * buf = bufferlist.getBuffer(included_file);
if (!buf) { if (!buf) {
// the readonly flag can/will be wrong, not anymore I think. // the readonly flag can/will be wrong, not anymore I think.
FileInfo finfo(included_file); if (!fs::exists(included_file))
if (!finfo.isOK())
return false; return false;
buf = bufferlist.newBuffer(included_file); buf = bufferlist.newBuffer(included_file);
if (!loadLyXFile(buf, included_file)) if (!loadLyXFile(buf, included_file))

View File

@ -13,13 +13,13 @@
#include "lastfiles.h" #include "lastfiles.h"
#include "debug.h" #include "debug.h"
#include "support/FileInfo.h" #include <boost/filesystem/operations.hpp>
#include <algorithm> #include <algorithm>
#include <fstream> #include <fstream>
#include <iterator> #include <iterator>
using lyx::support::FileInfo; namespace fs = boost::filesystem;
using std::copy; using std::copy;
using std::endl; using std::endl;
@ -58,14 +58,10 @@ void LastFiles::readFile(string const & filename)
// we issue a warning. (Lgb) // we issue a warning. (Lgb)
ifstream ifs(filename.c_str()); ifstream ifs(filename.c_str());
string tmp; string tmp;
FileInfo fileInfo;
while (getline(ifs, tmp) && files.size() < num_files) { while (getline(ifs, tmp) && files.size() < num_files) {
if (dostat) { if (dostat && !fs::exists(tmp))
if (!(fileInfo.newFile(tmp).exist() &&
fileInfo.isRegular()))
continue; continue;
}
files.push_back(tmp); files.push_back(tmp);
} }
} }

View File

@ -36,15 +36,16 @@
#include "frontends/LyXView.h" #include "frontends/LyXView.h"
#include "support/filefilterlist.h" #include "support/filefilterlist.h"
#include "support/FileInfo.h"
#include "support/filetools.h" #include "support/filetools.h"
#include "support/forkedcall.h" #include "support/forkedcall.h"
#include "support/fs_extras.h"
#include "support/lyxlib.h" #include "support/lyxlib.h"
#include "support/package.h" #include "support/package.h"
#include "support/path.h" #include "support/path.h"
#include "support/systemcall.h" #include "support/systemcall.h"
#include <boost/shared_ptr.hpp> #include <boost/shared_ptr.hpp>
#include <boost/filesystem/operations.hpp>
#include <cerrno> #include <cerrno>
#include <fstream> #include <fstream>
@ -53,7 +54,6 @@ using lyx::support::AddName;
using lyx::support::bformat; using lyx::support::bformat;
using lyx::support::destroyDir; using lyx::support::destroyDir;
using lyx::support::FileFilterList; using lyx::support::FileFilterList;
using lyx::support::FileInfo;
using lyx::support::ForkedProcess; using lyx::support::ForkedProcess;
using lyx::support::IsLyXFilename; using lyx::support::IsLyXFilename;
using lyx::support::LibFileSearch; using lyx::support::LibFileSearch;
@ -73,6 +73,8 @@ using lyx::support::unlink;
using boost::shared_ptr; using boost::shared_ptr;
namespace fs = boost::filesystem;
using std::back_inserter; using std::back_inserter;
using std::copy; using std::copy;
using std::endl; using std::endl;
@ -154,8 +156,7 @@ bool WriteAs(Buffer * buffer, string const & filename)
} else } else
fname = filename; fname = filename;
FileInfo const myfile(fname); if (fs::exists(fname)) {
if (myfile.isOK()) {
string const file = MakeDisplayPath(fname, 30); string const file = MakeDisplayPath(fname, 30);
string text = bformat(_("The document %1$s already exists.\n\n" string text = bformat(_("The document %1$s already exists.\n\n"
"Do you want to over-write that document?"), file); "Do you want to over-write that document?"), file);
@ -204,10 +205,11 @@ void QuitLyX()
// do any other cleanup procedures now // do any other cleanup procedures now
lyxerr[Debug::INFO] << "Deleting tmp dir " << package().temp_dir() << endl; lyxerr[Debug::INFO] << "Deleting tmp dir " << package().temp_dir() << endl;
if (destroyDir(package().temp_dir()) != 0) { if (!destroyDir(package().temp_dir())) {
string msg = bformat(_("Could not remove the temporary directory %1$s"), string const msg =
bformat(_("Unable to remove the temporary directory %1$s"),
package().temp_dir()); package().temp_dir());
Alert::warning(_("Could not remove temporary directory"), msg); Alert::warning(_("Unable to remove temporary directory"), msg);
} }
lyx_gui::exit(); lyx_gui::exit();
@ -392,9 +394,7 @@ string getContentsOfAsciiFile(BufferView * bv, string const & f, bool asParagrap
return string(); return string();
} }
FileInfo fi(fname); if (!fs::is_readable(fname)) {
if (!fi.readable()) {
string const error = strerror(errno); string const error = strerror(errno);
string const file = MakeDisplayPath(fname, 50); string const file = MakeDisplayPath(fname, 50);
string const text = bformat(_("Could not read the specified document\n" string const text = bformat(_("Could not read the specified document\n"

View File

@ -45,7 +45,6 @@
#include "frontends/lyx_gui.h" #include "frontends/lyx_gui.h"
#include "frontends/LyXView.h" #include "frontends/LyXView.h"
#include "support/FileInfo.h"
#include "support/filetools.h" #include "support/filetools.h"
#include "support/lyxlib.h" #include "support/lyxlib.h"
#include "support/os.h" #include "support/os.h"
@ -53,6 +52,7 @@
#include "support/path.h" #include "support/path.h"
#include <boost/bind.hpp> #include <boost/bind.hpp>
#include <boost/filesystem/operations.hpp>
#include <iostream> #include <iostream>
#include <csignal> #include <csignal>
@ -62,7 +62,6 @@ using lyx::support::AddPath;
using lyx::support::bformat; using lyx::support::bformat;
using lyx::support::createDirectory; using lyx::support::createDirectory;
using lyx::support::createLyXTmpDir; using lyx::support::createLyXTmpDir;
using lyx::support::FileInfo;
using lyx::support::FileSearch; using lyx::support::FileSearch;
using lyx::support::GetEnv; using lyx::support::GetEnv;
using lyx::support::i18nLibFileSearch; using lyx::support::i18nLibFileSearch;
@ -74,6 +73,7 @@ using lyx::support::QuoteName;
using lyx::support::rtrim; using lyx::support::rtrim;
namespace os = lyx::support::os; namespace os = lyx::support::os;
namespace fs = boost::filesystem;
using std::endl; using std::endl;
using std::string; using std::string;
@ -483,8 +483,7 @@ void LyX::init(bool gui)
if (reconfigure) if (reconfigure)
reconfigureUserLyXDir(); reconfigureUserLyXDir();
FileInfo fi(lyxrc.document_path); if (fs::is_directory(lyxrc.document_path))
if (fi.isOK() && fi.isDir())
package().document_dir() = lyxrc.document_path; package().document_dir() = lyxrc.document_path;
package().temp_dir() = createLyXTmpDir(lyxrc.tempdir_path); package().temp_dir() = createLyXTmpDir(lyxrc.tempdir_path);
@ -612,15 +611,16 @@ bool LyX::queryUserLyXDir(bool explicit_userdir)
bool reconfigure = false; bool reconfigure = false;
// Does user directory exist? // Does user directory exist?
FileInfo fileInfo(package().user_support()); if (fs::is_directory(package().user_support())) {
if (fileInfo.isOK() && fileInfo.isDir()) {
first_start = false; first_start = false;
string const configure_script = string const configure_script =
AddName(package().system_support(), "configure"); AddName(package().system_support(), "configure");
FileInfo script(configure_script); string const userDefaults =
FileInfo defaults(AddName(package().user_support(), "lyxrc.defaults")); AddName(package().user_support(), "lyxrc.defaults");
if (defaults.isOK() && script.isOK() if (fs::exists(configure_script) &&
&& defaults.getModificationTime() < script.getModificationTime()) { fs::exists(userDefaults) &&
fs::last_write_time(configure_script)
< fs::last_write_time(userDefaults)) {
reconfigure = true; reconfigure = true;
} }
return reconfigure; return reconfigure;

View File

@ -79,9 +79,9 @@
#include "frontends/Toolbars.h" #include "frontends/Toolbars.h"
#include "support/filefilterlist.h" #include "support/filefilterlist.h"
#include "support/FileInfo.h"
#include "support/filetools.h" #include "support/filetools.h"
#include "support/forkedcontr.h" #include "support/forkedcontr.h"
#include "support/fs_extras.h"
#include "support/lstrings.h" #include "support/lstrings.h"
#include "support/path.h" #include "support/path.h"
#include "support/package.h" #include "support/package.h"
@ -89,6 +89,8 @@
#include "support/convert.h" #include "support/convert.h"
#include "support/os.h" #include "support/os.h"
#include <boost/filesystem/operations.hpp>
#include <sstream> #include <sstream>
using bv_funcs::freefont2string; using bv_funcs::freefont2string;
@ -99,7 +101,6 @@ using lyx::support::bformat;
using lyx::support::ChangeExtension; using lyx::support::ChangeExtension;
using lyx::support::contains; using lyx::support::contains;
using lyx::support::FileFilterList; using lyx::support::FileFilterList;
using lyx::support::FileInfo;
using lyx::support::FileSearch; using lyx::support::FileSearch;
using lyx::support::ForkedcallsController; using lyx::support::ForkedcallsController;
using lyx::support::i18nLibFileSearch; using lyx::support::i18nLibFileSearch;
@ -126,6 +127,7 @@ using std::string;
using std::istringstream; using std::istringstream;
namespace biblio = lyx::biblio; namespace biblio = lyx::biblio;
namespace fs = boost::filesystem;
extern BufferList bufferlist; extern BufferList bufferlist;
@ -1610,13 +1612,11 @@ void LyXFunc::menuNew(string const & name, bool fromTemplate)
if (filename.empty()) { if (filename.empty()) {
filename = AddName(lyxrc.document_path, filename = AddName(lyxrc.document_path,
"newfile" + convert<string>(++newfile_number) + ".lyx"); "newfile" + convert<string>(++newfile_number) + ".lyx");
FileInfo fi(filename); while (bufferlist.exists(filename) || fs::is_readable(filename)) {
while (bufferlist.exists(filename) || fi.readable()) {
++newfile_number; ++newfile_number;
filename = AddName(lyxrc.document_path, filename = AddName(lyxrc.document_path,
"newfile" + convert<string>(newfile_number) + "newfile" + convert<string>(newfile_number) +
".lyx"); ".lyx");
fi.newFile(filename);
} }
} }
@ -1695,8 +1695,7 @@ void LyXFunc::open(string const & fname)
string const disp_fn(MakeDisplayPath(filename)); string const disp_fn(MakeDisplayPath(filename));
// if the file doesn't exist, let the user create one // if the file doesn't exist, let the user create one
FileInfo const f(filename, true); if (!fs::exists(filename)) {
if (!f.exist()) {
// the user specifically chose this name. Believe them. // the user specifically chose this name. Believe them.
view()->newFile(filename, "", true); view()->newFile(filename, "", true);
return; return;
@ -1779,7 +1778,7 @@ void LyXFunc::doImport(string const & argument)
// if the file exists already, and we didn't do // if the file exists already, and we didn't do
// -i lyx thefile.lyx, warn // -i lyx thefile.lyx, warn
if (FileInfo(lyxfile, true).exist() && filename != lyxfile) { if (fs::exists(lyxfile) && filename != lyxfile) {
string const file = MakeDisplayPath(lyxfile, 30); string const file = MakeDisplayPath(lyxfile, 30);
string text = bformat(_("The document %1$s already exists.\n\n" string text = bformat(_("The document %1$s already exists.\n\n"
@ -1903,8 +1902,8 @@ void actOnUpdatedPrefs(LyXRC const & lyxrc_orig, LyXRC const & lyxrc_new)
case LyXRC::RC_DISPLAY_GRAPHICS: case LyXRC::RC_DISPLAY_GRAPHICS:
case LyXRC::RC_DOCUMENTPATH: case LyXRC::RC_DOCUMENTPATH:
if (lyxrc_orig.document_path != lyxrc_new.document_path) { if (lyxrc_orig.document_path != lyxrc_new.document_path) {
FileInfo fi(lyxrc_new.document_path); if (fs::exists(lyxrc_new.document_path) &&
if (fi.isOK() && fi.isDir()) { fs::is_directory(lyxrc_new.document_path)) {
using lyx::support::package; using lyx::support::package;
package().document_dir() = lyxrc.document_path; package().document_dir() = lyxrc.document_path;
} }

View File

@ -17,18 +17,23 @@
#include "support/os.h" #include "support/os.h"
#include <boost/filesystem/path.hpp>
#ifdef HAVE_IOS #ifdef HAVE_IOS
#include <ios> #include <ios>
#endif #endif
namespace os = lyx::support::os; namespace os = lyx::support::os;
namespace fs = boost::filesystem;
int main(int argc, char * argv[]) int main(int argc, char * argv[])
{ {
#ifdef HAVE_IOS #ifdef HAVE_IOS
std::ios_base::sync_with_stdio(false); std::ios_base::sync_with_stdio(false);
#endif #endif
fs::path::default_name_check(fs::no_check);
// To avoid ordering of global object problems with some // To avoid ordering of global object problems with some
// stdlibs we do the initialization here, but still as // stdlibs we do the initialization here, but still as
// early as possible. // early as possible.

View File

@ -7,3 +7,4 @@ libsupport.la
path_defines.C path_defines.C
pch.h.gch pch.h.gch
pch.h.gch.dep pch.h.gch.dep
package.C

View File

@ -1,10 +1,30 @@
2005-01-31 Lars Gullik Bjonnes <larsbj@gullik.net>
* .cvsignore: add package.C
* FileInfo.C, FileInfo.h: delete files
* fs_extras.C, fs_extras.h: new files
* FileMonitor.C, filetools.C: rewrite to use boost.filesystem
* Makefile.am (libsupport_la_SOURCES: delete FileInfo.[Ch], add
fs_extras.[Ch]
* filetools.C: make destroydir return true if something was
deleted. adjust callers.
(IsFileWritable): replace with is_readonly in fs_extras, adjust
callers
* package.C.in: rewrite to use boost.filesystem
2005-01-27 Lars Gullik Bjonnes <larsbj@gullik.net> 2005-01-27 Lars Gullik Bjonnes <larsbj@gullik.net>
* tests: add some code for automatic regression testing, can be * tests: add some code for automatic regression testing, can be
improved or removed as we see fit improved or removed as we see fit
* lyxlib.h (atoi): delete func * lyxlib.h (atoi): delete func
* lstrings.[Ch] (strToInt): delete func * lstrings.[Ch] (strToInt): delete func
(strToUnsignedInt): delete func (strToUnsignedInt): delete func
(strToDbl): delete func (strToDbl): delete func

View File

@ -1,393 +0,0 @@
/**
* \file FileInfo.C
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Lars Gullik Bjønnes
*
* Full author contact details are available in file CREDITS.
*/
#include <config.h>
#include "support/FileInfo.h"
#include "support/lstrings.h"
#include <boost/assert.hpp>
#include <cerrno>
#include <sys/types.h>
#include <sys/stat.h>
using std::string;
#if !S_IRUSR
# if S_IREAD
# define S_IRUSR S_IREAD
# else
# define S_IRUSR 00400
# endif
#endif
#if !S_IWUSR
# if S_IWRITE
# define S_IWUSR S_IWRITE
# else
# define S_IWUSR 00200
# endif
#endif
#if !S_IXUSR
# if S_IEXEC
# define S_IXUSR S_IEXEC
# else
# define S_IXUSR 00100
# endif
#endif
#ifdef STAT_MACROS_BROKEN
#undef S_ISBLK
#undef S_ISCHR
#undef S_ISDIR
#undef S_ISFIFO
#undef S_ISLNK
#undef S_ISMPB
#undef S_ISMPC
#undef S_ISNWK
#undef S_ISREG
#undef S_ISSOCK
#endif
#if !defined(S_ISBLK) && defined(S_IFBLK)
#define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
#endif
#if !defined(S_ISCHR) && defined(S_IFCHR)
#define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
#endif
#if !defined(S_ISDIR) && defined(S_IFDIR)
#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
#endif
#if !defined(S_ISREG) && defined(S_IFREG)
#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
#endif
#if !defined(S_ISFIFO) && defined(S_IFIFO)
#define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
#endif
#if !defined(S_ISLNK) && defined(S_IFLNK)
#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
#endif
#if !defined(S_ISSOCK) && defined(S_IFSOCK)
#define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
#endif
#if !defined(S_ISMPB) && defined(S_IFMPB) /* V7 */
#define S_ISMPB(m) (((m) & S_IFMT) == S_IFMPB)
#define S_ISMPC(m) (((m) & S_IFMT) == S_IFMPC)
#endif
#if !defined(S_ISNWK) && defined(S_IFNWK) /* HP/UX */
#define S_ISNWK(m) (((m) & S_IFMT) == S_IFNWK)
#endif
namespace {
// builds 'rwx' string describing file access rights
void flagRWX(mode_t i, char * str)
{
str[0] = (i & S_IRUSR) ? 'r' : '-';
str[1] = (i & S_IWUSR) ? 'w' : '-';
str[2] = (i & S_IXUSR) ? 'x' : '-';
}
// updates mode string to match suid/sgid/sticky bits
void setSticky(mode_t i, char * str)
{
#ifdef S_ISUID
if (i & S_ISUID)
str[3] = (str[3] == 'x') ? 's' : 'S';
#endif
#ifdef S_ISGID
if (i & S_ISGID)
str[6] = (str[6] == 'x') ? 's' : 'S';
#endif
#ifdef S_ISVTX
if (i & S_ISVTX)
str[9] = (str[9] == 'x') ? 's' : 'S';
#endif
}
// returns a letter describing a file type (ls style)
char typeLetter(mode_t i)
{
#ifdef S_ISBLK
if (S_ISBLK(i)) return 'b';
#endif
if (S_ISCHR(i)) return 'c';
if (S_ISDIR(i)) return 'd';
if (S_ISREG(i)) return '-';
#ifdef S_ISFIFO
if (S_ISFIFO(i)) return 'p';
#endif
#ifdef S_ISLNK
if (S_ISLNK(i)) return 'l';
#endif
#ifdef S_ISSOCK
if (S_ISSOCK(i)) return 's';
#endif
#ifdef S_ISMPC
if (S_ISMPC(i)) return 'm';
#endif
#ifdef S_ISNWK
if (S_ISNWK(i)) return 'n';
#endif
return '?';
}
} // namespace anon
namespace lyx {
namespace support {
FileInfo::FileInfo()
{
init();
}
FileInfo::FileInfo(string const & path, bool link)
// Win32 stat() doesn't dig trailing slashes.
// Posix stat() doesn't care, but we'll remove it anyway.
: fname_(rtrim(path, "/"))
{
init();
dostat(link);
}
FileInfo::FileInfo(int fildes)
{
init();
status_ = fstat(fildes, &buf_);
if (status_)
err_ = errno;
}
void FileInfo::init()
{
status_ = 0;
err_ = NoErr;
}
void FileInfo::dostat(bool link)
{
#ifdef HAVE_LSTAT
if (link)
status_ = ::lstat(fname_.c_str(), &buf_);
else
status_ = ::stat(fname_.c_str(), &buf_);
#else
status_ = ::stat(fname_.c_str(), &buf_);
#endif
if (status_)
err_ = errno;
}
FileInfo & FileInfo::newFile(string const & path, bool link)
{
// Win32 stat() doesn't dig trailing slashes.
// Posix stat() doesn't care, but we'll remove it anyway.
fname_ = rtrim(path, "/");
status_ = 0;
err_ = NoErr;
dostat(link);
return *this;
}
FileInfo & FileInfo::newFile(int fildes)
{
status_ = 0;
err_ = NoErr;
status_ = fstat(fildes, &buf_);
if (status_)
err_ = errno;
return *this;
}
// should not be in FileInfo
char FileInfo::typeIndicator() const
{
BOOST_ASSERT(isOK());
if (S_ISDIR(buf_.st_mode))
return '/';
#ifdef S_ISLNK
if (S_ISLNK(buf_.st_mode))
return '@';
#endif
#ifdef S_ISFIFO
if (S_ISFIFO(buf_.st_mode))
return '|';
#endif
#ifdef S_ISSOCK
if (S_ISSOCK(buf_.st_mode))
return '=';
#endif
return ' ';
}
mode_t FileInfo::getMode() const
{
BOOST_ASSERT(isOK());
return buf_.st_mode;
}
// should not be in FileInfo
string FileInfo::modeString() const
{
BOOST_ASSERT(isOK());
char str[11];
str[0] = typeLetter(buf_.st_mode);
flagRWX((buf_.st_mode & 0700) << 0, &str[1]);
flagRWX((buf_.st_mode & 0070) << 3, &str[4]);
flagRWX((buf_.st_mode & 0007) << 6, &str[7]);
setSticky(buf_.st_mode, str);
str[10] = 0;
return str;
}
time_t FileInfo::getModificationTime() const
{
BOOST_ASSERT(isOK());
return buf_.st_mtime;
}
time_t FileInfo::getAccessTime() const
{
BOOST_ASSERT(isOK());
return buf_.st_atime;
}
time_t FileInfo::getStatusChangeTime() const
{
BOOST_ASSERT(isOK());
return buf_.st_ctime;
}
uid_t FileInfo::getUid() const
{
BOOST_ASSERT(isOK());
return buf_.st_uid;
}
gid_t FileInfo::getGid() const
{
BOOST_ASSERT(isOK());
return buf_.st_gid;
}
off_t FileInfo::getSize() const
{
BOOST_ASSERT(isOK());
return buf_.st_size;
}
int FileInfo::getError() const
{
return err_;
}
bool FileInfo::isOK() const
{
return status_ == 0;
}
bool FileInfo::isLink() const
{
BOOST_ASSERT(isOK());
#ifdef S_ISLNK
return S_ISLNK(buf_.st_mode);
#else
return false;
#endif
}
bool FileInfo::isRegular() const
{
BOOST_ASSERT(isOK());
return S_ISREG(buf_.st_mode);
}
bool FileInfo::isDir() const
{
BOOST_ASSERT(isOK());
return S_ISDIR(buf_.st_mode);
}
bool FileInfo::isChar() const
{
BOOST_ASSERT(isOK());
return S_ISCHR(buf_.st_mode);
}
bool FileInfo::isBlock() const
{
BOOST_ASSERT(isOK());
return S_ISBLK(buf_.st_mode);
}
bool FileInfo::isFifo() const
{
BOOST_ASSERT(isOK());
return S_ISFIFO(buf_.st_mode);
}
bool FileInfo::isSocket() const
{
BOOST_ASSERT(isOK());
#ifdef S_ISSOCK
return S_ISSOCK(buf_.st_mode);
#else
return false;
#endif
}
// should not be in FileInfo
bool FileInfo::access(int p) const
{
// if we don't have a filename we fail
if (fname_.empty())
return false;
// If we were really kind, we would also tell why
// the file access failed.
return ::access(fname_.c_str(), p) == 0;
}
} // namespace support
} // namespace lyx

View File

@ -1,145 +0,0 @@
// -*- C++ -*-
/**
* \file FileInfo.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Lars Gullik Bjønnes
*
* Full author contact details are available in file CREDITS.
*/
#ifndef FILE_INFO_H
#define FILE_INFO_H
#include <boost/utility.hpp>
#include <sys/types.h>
#include <sys/stat.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
#include <ctime>
#include <string>
namespace lyx {
namespace support {
/** Use objects of this class to get information about files.
*
* Users must make sure to check fi.isOK() before any operations
* requiring the file to exist such as fi.isDir()
*/
class FileInfo : boost::noncopyable {
public:
///
FileInfo();
/** Get information about file.
If link is true, the information is about the link itself, not
the file that is obtained by tracing the links. */
explicit FileInfo(std::string const & path, bool link = false);
/// File descriptor
explicit FileInfo(int fildes);
/// Query a new file
FileInfo & newFile(std::string const & path, bool link = false);
/// Query a new file descriptor
FileInfo & newFile(int fildes);
/// Returns a character describing file type (ls -F)
char typeIndicator() const;
/// File protection mode
mode_t getMode() const;
/// Constructs standard mode string (ls style)
std::string modeString() const;
///
time_t getModificationTime() const;
///
time_t getAccessTime() const;
///
time_t getStatusChangeTime() const;
/// Total file size in bytes
off_t getSize() const;
/// User ID of owner
uid_t getUid() const;
/// Group ID of owner
gid_t getGid() const;
/// Is the file information correct? Did the query succeed?
bool isOK() const;
/// Permission flags
enum perm_test {
/// test for read permission
rperm = R_OK,
/// test for write permission
wperm = W_OK,
/// test for execute (search) permission
xperm = X_OK,
/// test for existence of file
eperm = F_OK
};
/// Test whether the current user has a given set of permissions
bool access(int p) const;
/// Is the file writable for the current user?
bool writable() const { return access(FileInfo::wperm); }
/// Is the file readable for the current user?
bool readable() const { return access(FileInfo::rperm); }
/// Is the file executable for the current user?
bool executable() const { return access(FileInfo::xperm); }
/// Does the file exist?
bool exist() const { return access(FileInfo::eperm); }
///
bool isLink() const;
///
bool isRegular() const;
///
bool isDir() const;
///
bool isChar() const;
///
bool isBlock() const;
///
bool isFifo() const;
///
bool isSocket() const;
///
int getError() const;
///
enum Err {
///
NoErr = -1
};
private:
///
void init();
///
void dostat(bool);
///
struct stat buf_;
///
int status_;
///
int err_;
///
std::string fname_;
};
} // namespace support
} // namespace lyx
#endif

View File

@ -11,18 +11,19 @@
#include <config.h> #include <config.h>
#include "support/FileMonitor.h" #include "support/FileMonitor.h"
#include "support/FileInfo.h"
#include "support/lyxlib.h" #include "support/lyxlib.h"
// FIXME Interface violation // FIXME Interface violation
#include "frontends/Timeout.h" #include "frontends/Timeout.h"
#include <boost/bind.hpp> #include <boost/bind.hpp>
#include <boost/filesystem/operations.hpp>
#include <boost/signals/trackable.hpp> #include <boost/signals/trackable.hpp>
using std::string; using std::string;
namespace fs = boost::filesystem;
namespace lyx { namespace lyx {
namespace support { namespace support {
@ -90,11 +91,10 @@ void FileMonitor::start() const
if (monitoring()) if (monitoring())
return; return;
FileInfo finfo(pimpl_->filename_); if (!fs::exists(pimpl_->filename_))
if (!finfo.isOK())
return; return;
pimpl_->timestamp_ = finfo.getModificationTime(); pimpl_->timestamp_ = fs::last_write_time(pimpl_->filename_);
pimpl_->checksum_ = sum(pimpl_->filename_); pimpl_->checksum_ = sum(pimpl_->filename_);
if (pimpl_->timestamp_ && pimpl_->checksum_) { if (pimpl_->timestamp_ && pimpl_->checksum_) {
@ -156,14 +156,13 @@ void FileMonitor::Impl::monitorFile()
{ {
bool changed = false; bool changed = false;
FileInfo finfo(filename_); if (!fs::exists(filename_)) {
if (!finfo.isOK()) {
changed = timestamp_ || checksum_; changed = timestamp_ || checksum_;
timestamp_ = 0; timestamp_ = 0;
checksum_ = 0; checksum_ = 0;
} else { } else {
time_t const new_timestamp = finfo.getModificationTime(); time_t const new_timestamp = fs::last_write_time(filename_);
if (new_timestamp != timestamp_) { if (new_timestamp != timestamp_) {
timestamp_ = new_timestamp; timestamp_ = new_timestamp;

View File

@ -17,8 +17,6 @@ BUILT_SOURCES = package.C
AM_CPPFLAGS = $(PCH_FLAGS) -I$(srcdir)/.. $(BOOST_INCLUDES) AM_CPPFLAGS = $(PCH_FLAGS) -I$(srcdir)/.. $(BOOST_INCLUDES)
libsupport_la_SOURCES = \ libsupport_la_SOURCES = \
FileInfo.C \
FileInfo.h \
FileMonitor.h \ FileMonitor.h \
FileMonitor.C \ FileMonitor.C \
abort.C \ abort.C \
@ -41,6 +39,8 @@ libsupport_la_SOURCES = \
forkedcallqueue.h \ forkedcallqueue.h \
forkedcontr.C \ forkedcontr.C \
forkedcontr.h \ forkedcontr.h \
fs_extras.C \
fs_extras.h \
getcwd.C \ getcwd.C \
globbing.C \ globbing.C \
globbing.h \ globbing.h \

View File

@ -25,8 +25,8 @@
#include "support/systemcall.h" #include "support/systemcall.h"
#include "support/filetools.h" #include "support/filetools.h"
#include "support/lstrings.h" #include "support/lstrings.h"
#include "support/FileInfo.h"
#include "support/forkedcontr.h" #include "support/forkedcontr.h"
#include "support/fs_extras.h"
#include "support/package.h" #include "support/package.h"
#include "support/path.h" #include "support/path.h"
#include "support/lyxlib.h" #include "support/lyxlib.h"
@ -37,6 +37,7 @@
#include "debug.h" #include "debug.h"
#include <boost/assert.hpp> #include <boost/assert.hpp>
#include <boost/filesystem/operations.hpp>
#include <boost/regex.hpp> #include <boost/regex.hpp>
#include <boost/tokenizer.hpp> #include <boost/tokenizer.hpp>
@ -51,25 +52,6 @@
#include <fstream> #include <fstream>
#include <sstream> #include <sstream>
// Which part of this is still necessary? (JMarc).
#if HAVE_DIRENT_H
# include <dirent.h>
# define NAMLEN(dirent) strlen((dirent)->d_name)
#else
# define dirent direct
# define NAMLEN(dirent) (dirent)->d_namlen
# if HAVE_SYS_NDIR_H
# include <sys/ndir.h>
# endif
# if HAVE_SYS_DIR_H
# include <sys/dir.h>
# endif
# if HAVE_NDIR_H
# include <ndir.h>
# endif
#endif
#ifndef CXX_GLOBAL_CSTD #ifndef CXX_GLOBAL_CSTD
using std::fgetc; using std::fgetc;
using std::isalnum; using std::isalnum;
@ -84,6 +66,7 @@ using std::ifstream;
using std::ostringstream; using std::ostringstream;
using std::vector; using std::vector;
namespace fs = boost::filesystem;
namespace lyx { namespace lyx {
namespace support { namespace support {
@ -135,24 +118,7 @@ string const QuoteName(string const & name)
// Is a file readable ? // Is a file readable ?
bool IsFileReadable(string const & path) bool IsFileReadable(string const & path)
{ {
FileInfo file(path); return fs::exists(path) && !fs::is_directory(path) && fs::is_readable(path);
return file.isOK() && file.isRegular() && file.readable();
}
// Is a file read_only?
// return 1 read-write
// 0 read_only
// -1 error (doesn't exist, no access, anything else)
int IsFileWriteable(string const & path)
{
FileInfo fi(path);
if (fi.access(FileInfo::wperm|FileInfo::rperm)) // read-write
return 1;
if (fi.readable()) // read-only
return 0;
return -1; // everything else.
} }
@ -217,51 +183,30 @@ string const FileOpenSearch(string const & path, string const & name,
/// Returns a vector of all files in directory dir having extension ext. /// Returns a vector of all files in directory dir having extension ext.
vector<string> const DirList(string const & dir, string const & ext) vector<string> const DirList(string const & dir, string const & ext)
{ {
// This is a non-error checking C/system implementation // EXCEPTIONS FIXME. Rewrite needed when we turn on exceptions. (Lgb)
string extension;
if (!ext.empty() && ext[0] != '.')
extension += '.';
extension += ext;
vector<string> dirlist; vector<string> dirlist;
DIR * dirp = ::opendir(dir.c_str());
if (!dirp) { if (!(fs::exists(dir) && fs::is_directory(dir))) {
lyxerr[Debug::FILES] lyxerr[Debug::FILES]
<< "Directory \"" << dir << "Directory \"" << dir
<< "\" does not exist to DirList." << endl; << "\" does not exist to DirList." << endl;
return dirlist; return dirlist;
} }
dirent * dire; string extension;
while ((dire = ::readdir(dirp))) { if (!ext.empty() && ext[0] != '.')
string const fil = dire->d_name; extension += '.';
extension += ext;
fs::directory_iterator dit(dir);
fs::directory_iterator end;
for (; dit != end; ++dit) {
string const & fil = dit->leaf();
if (suffixIs(fil, extension)) { if (suffixIs(fil, extension)) {
dirlist.push_back(fil); dirlist.push_back(fil);
} }
} }
::closedir(dirp);
return dirlist; return dirlist;
/* I would have prefered to take a vector<string>& as parameter so
that we could avoid the copy of the vector when returning.
Then we would use:
dirlist.swap(argvec);
to avoid the copy. (Lgb)
*/
/* A C++ implementaion will look like this:
string extension(ext);
if (extension[0] != '.') extension.insert(0, 1, '.');
vector<string> dirlist;
directory_iterator dit("dir");
while (dit != directory_iterator()) {
string fil = dit->filename;
if (prefixIs(fil, extension)) {
dirlist.push_back(fil);
}
++dit;
}
dirlist.swap(argvec);
return;
*/
} }
@ -498,55 +443,6 @@ bool putEnv(string const & envstr)
namespace { namespace {
int DeleteAllFilesInDir(string const & path)
{
// I have decided that we will be using parts from the boost
// library. Check out http://www.boost.org/
// For directory access we will then use the directory_iterator.
// Then the code will be something like:
// directory_iterator dit(path);
// directory_iterator dend;
// if (dit == dend) {
// return -1;
// }
// for (; dit != dend; ++dit) {
// string filename(*dit);
// if (filename == "." || filename == "..")
// continue;
// string unlinkpath(AddName(path, filename));
// lyx::unlink(unlinkpath);
// }
// return 0;
DIR * dir = ::opendir(path.c_str());
if (!dir)
return -1;
struct dirent * de;
int return_value = 0;
while ((de = readdir(dir))) {
string const temp = de->d_name;
if (temp == "." || temp == "..")
continue;
string const unlinkpath = AddName (path, temp);
lyxerr[Debug::FILES] << "Deleting file: " << unlinkpath
<< endl;
bool deleted = true;
FileInfo fi(unlinkpath);
if (fi.isOK() && fi.isDir()) {
deleted = (DeleteAllFilesInDir(unlinkpath) == 0);
deleted &= (rmdir(unlinkpath) == 0);
} else
deleted &= (unlink(unlinkpath) == 0);
if (!deleted)
return_value = -1;
}
closedir(dir);
return return_value;
}
string const createTmpDir(string const & tempdir, string const & mask) string const createTmpDir(string const & tempdir, string const & mask)
{ {
lyxerr[Debug::FILES] lyxerr[Debug::FILES]
@ -572,18 +468,13 @@ string const createTmpDir(string const & tempdir, string const & mask)
} // namespace anon } // namespace anon
int destroyDir(string const & tmpdir) bool destroyDir(string const & tmpdir)
{ {
#ifdef __EMX__ #ifdef __EMX__
Path p(user_lyxdir()); Path p(user_lyxdir());
#endif #endif
if (DeleteAllFilesInDir(tmpdir)) return fs::remove_all(tmpdir) > 0;
return -1;
if (rmdir(tmpdir))
return -1;
return 0;
} }
@ -844,8 +735,7 @@ string const NormalizePath(string const & path)
string const GetFileContents(string const & fname) string const GetFileContents(string const & fname)
{ {
FileInfo finfo(fname); if (fs::exists(fname)) {
if (finfo.exist()) {
ifstream ifs(fname.c_str()); ifstream ifs(fname.c_str());
ostringstream ofs; ostringstream ofs;
if (ifs && ofs) { if (ifs && ofs) {
@ -1319,7 +1209,7 @@ string const findtexfile(string const & fil, string const & /*format*/)
// If the file can be found directly, we just return a // If the file can be found directly, we just return a
// absolute path version of it. // absolute path version of it.
if (FileInfo(fil).exist()) if (fs::exists(fil))
return MakeAbsPath(fil); return MakeAbsPath(fil);
// No we try to find it using kpsewhich. // No we try to find it using kpsewhich.
@ -1362,8 +1252,7 @@ void removeAutosaveFile(string const & filename)
a += '#'; a += '#';
a += OnlyFilename(filename); a += OnlyFilename(filename);
a += '#'; a += '#';
FileInfo const fileinfo(a); if (fs::exists(a))
if (fileinfo.exist())
unlink(a); unlink(a);
} }
@ -1421,19 +1310,17 @@ int compare_timestamps(string const & file1, string const & file2)
// If the original is newer than the copy, then copy the original // If the original is newer than the copy, then copy the original
// to the new directory. // to the new directory.
FileInfo f1(file1);
FileInfo f2(file2);
int cmp = 0; int cmp = 0;
if (f1.exist() && f2.exist()) { if (fs::exists(file1) && fs::exists(file2)) {
double const tmp = difftime(f1.getModificationTime(), double const tmp = difftime(fs::last_write_time(file1),
f2.getModificationTime()); fs::last_write_time(file2));
if (tmp != 0) if (tmp != 0)
cmp = tmp > 0 ? 1 : -1; cmp = tmp > 0 ? 1 : -1;
} else if (f1.exist()) { } else if (fs::exists(file1)) {
cmp = 1; cmp = 1;
} else if (f2.exist()) { } else if (fs::exists(file2)) {
cmp = -1; cmp = -1;
} }

View File

@ -19,8 +19,8 @@
namespace lyx { namespace lyx {
namespace support { namespace support {
/// remove directory and all contents, returns 0 on success /// remove directory and all contents, returns true on success
int destroyDir(std::string const & tmpdir); bool destroyDir(std::string const & tmpdir);
/// Creates the per buffer temporary directory /// Creates the per buffer temporary directory
std::string const createBufferTmpDir(); std::string const createBufferTmpDir();
@ -70,14 +70,6 @@ bool IsDirWriteable (std::string const & path);
*/ */
bool IsFileReadable (std::string const & path); bool IsFileReadable (std::string const & path);
/** Is file read only?
returns
1: read-write
0: read_only
-1: error (doesn't exist, no access, anything else)
*/
int IsFileWriteable (std::string const & path);
/// ///
bool IsLyXFilename(std::string const & filename); bool IsLyXFilename(std::string const & filename);

123
src/support/fs_extras.C Normal file
View File

@ -0,0 +1,123 @@
// -*- C++ -*-
#include <config.h>
#include "fs_extras.h"
#include <boost/filesystem/config.hpp>
#include <boost/filesystem/exception.hpp>
#include <boost/detail/workaround.hpp>
#include <boost/throw_exception.hpp>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
// BOOST_POSIX or BOOST_WINDOWS specify which API to use.
# if !defined( BOOST_WINDOWS ) && !defined( BOOST_POSIX )
# if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__CYGWIN__)
# define BOOST_WINDOWS
# else
# define BOOST_POSIX
# endif
# endif
namespace fs = boost::filesystem;
namespace boost {
namespace filesystem {
bool is_readable(path const & ph)
{
#ifdef BOOST_POSIX
return ::access(ph.string().c_str(), R_OK) == 0;
#endif
}
bool is_writable(path const & ph)
{
#ifdef BOOST_POSIX
return ::access(ph.string().c_str(), W_OK) == 0;
#endif
}
bool is_readonly(path const & ph)
{
#ifdef BOOST_POSIX
return is_readable(ph) && !is_writable(ph);
#endif
}
void copy_file(path const & source, path const & target, bool noclobber)
{
#ifdef BOOST_POSIX
int const infile = ::open(source.string().c_str(), O_RDONLY);
if (infile == -1) {
boost::throw_exception(
filesystem_error(
"boost::filesystem::copy_file",
source, target,
fs::detail::system_error_code()));
}
struct stat source_stat;
int const ret = ::fstat(infile, &source_stat);
if (ret == -1) {
::close(infile);
boost::throw_exception(
filesystem_error(
"boost::filesystem::copy_file",
source, target,
fs::detail::system_error_code()));
}
int const flags = O_WRONLY | O_CREAT | (noclobber ? O_EXCL : O_TRUNC);
int const outfile = ::open(target.string().c_str(), flags, source_stat.st_mode);
if (outfile == -1) {
::close(infile);
boost::throw_exception(
filesystem_error(
"boost::filesystem::copy_file",
source, target,
fs::detail::system_error_code()));
}
std::size_t const buf_sz = 32768;
char buf[buf_sz];
ssize_t in = -1;
ssize_t out = -1;
while (true) {
in = ::read(infile, buf, buf_sz);
if (in == -1) {
break;
} else if (in == 0) {
break;
} else {
out = ::write(outfile, buf, in);
if (out == -1) {
break;
}
}
}
::close(infile);
::close(outfile);
if (in == -1 || out == -1)
boost::throw_exception(
filesystem_error(
"boost::filesystem::copy_file",
source, target,
fs::detail::system_error_code()));
#endif
}
}
}

17
src/support/fs_extras.h Normal file
View File

@ -0,0 +1,17 @@
// -*- C++ -*-
#include <boost/filesystem/path.hpp>
namespace boost {
namespace filesystem {
bool is_readable(path const & ph);
bool is_writable(path const & ph);
bool is_readonly(path const & ph);
void copy_file(path const & source, path const & target, bool noclobber);
}
}

View File

@ -19,12 +19,12 @@
#include "debug.h" #include "debug.h"
#include "gettext.h" #include "gettext.h"
#include "support/FileInfo.h"
#include "support/filetools.h" #include "support/filetools.h"
#include "support/lstrings.h" #include "support/lstrings.h"
#include "support/os.h" #include "support/os.h"
#include <boost/assert.hpp> #include <boost/assert.hpp>
#include <boost/filesystem/operations.hpp>
#include <boost/tuple/tuple.hpp> #include <boost/tuple/tuple.hpp>
#include <list> #include <list>
@ -51,6 +51,7 @@
using std::string; using std::string;
namespace fs = boost::filesystem;
namespace lyx { namespace lyx {
namespace support { namespace support {
@ -257,8 +258,7 @@ std::pair<string, string> const get_build_dirs(string const & abs_binary)
// Check whether binary is a symbolic link. // Check whether binary is a symbolic link.
// If so, resolve it and repeat the exercise. // If so, resolve it and repeat the exercise.
FileInfo const file(binary, true); if (!fs::symbolic_link_exists(binary))
if (!file.isOK() || !file.isLink())
break; break;
string link; string link;
@ -317,14 +317,12 @@ string const get_locale_dir(string const & system_support_dir)
// be "../locale/".) // be "../locale/".)
path = NormalizePath(AddPath(system_support_dir, relative_locale_dir())); path = NormalizePath(AddPath(system_support_dir, relative_locale_dir()));
FileInfo fi(path); if (fs::exists(path) && fs::is_directory(path))
if (fi.isOK() && fi.isDir())
return path; return path;
// 3. Fall back to the hard-coded LOCALEDIR. // 3. Fall back to the hard-coded LOCALEDIR.
path = hardcoded_localedir(); path = hardcoded_localedir();
FileInfo fi2(path); if (fs::exists(path) && fs::is_directory(path))
if (fi2.isOK() && fi2.isDir())
return path; return path;
return string(); return string();
@ -378,7 +376,7 @@ string const get_binary_path(string const & exe)
// Two possibilities present themselves. // Two possibilities present themselves.
// 1. The binary is relative to the CWD. // 1. The binary is relative to the CWD.
string const abs_exe_path = MakeAbsPath(exe_path); string const abs_exe_path = MakeAbsPath(exe_path);
if (FileInfo(abs_exe_path, true).isOK()) if (fs::exists(abs_exe_path))
return abs_exe_path; return abs_exe_path;
// 2. exe must be the name of the binary only and it // 2. exe must be the name of the binary only and it
@ -395,7 +393,7 @@ string const get_binary_path(string const & exe)
string const exe_dir = MakeAbsPath(*it); string const exe_dir = MakeAbsPath(*it);
string const exe_path = AddName(exe_dir, exe_name); string const exe_path = AddName(exe_dir, exe_name);
if (FileInfo(exe_path, true).isOK()) if (fs::exists(exe_path))
return exe_path; return exe_path;
} }
@ -473,8 +471,7 @@ get_system_support_dir(string const & abs_binary,
// Check whether binary is a symbolic link. // Check whether binary is a symbolic link.
// If so, resolve it and repeat the exercise. // If so, resolve it and repeat the exercise.
FileInfo const file(binary, true); if (!fs::symbolic_link_exists(binary))
if (!file.isOK() || !file.isLink())
break; break;
string link; string link;
@ -492,8 +489,7 @@ get_system_support_dir(string const & abs_binary,
// This time test whether the directory is a symbolic link // This time test whether the directory is a symbolic link
// *before* looking for "chkconfig.ltx". // *before* looking for "chkconfig.ltx".
// (We've looked relative to the original already.) // (We've looked relative to the original already.)
FileInfo const file(binary_dir, true); if (!fs::symbolic_link_exists(binary))
if (!file.isOK() || !file.isLink())
break; break;
string link; string link;
@ -657,8 +653,7 @@ bool check_env_var_dir(string const & dir,
bool check_env_var_dir(string const & dir, bool check_env_var_dir(string const & dir,
string const & env_var) string const & env_var)
{ {
FileInfo fi(dir); bool const success = (fs::exists(dir) && fs::is_directory(dir));
bool const success = (fi.isOK() && fi.isDir());
if (!success) { if (!success) {
// Put this string on a single line so that the gettext // Put this string on a single line so that the gettext

View File

@ -4,3 +4,5 @@ Makefile.in
.libs .libs
convert convert
lstrings lstrings
pch.h.gch
pch.h.gch.dep

View File

@ -1,3 +1,10 @@
2005-01-31 Lars Gullik Bjonnes <larsbj@gullik.net>
* tex2lyx.C: rewrite to use boost.filesystem
* text.C: ditto
* Makefile.am (BOOST_LIBS): add BOOST_FILESYSTEM
2005-01-27 Lars Gullik Bjonnes <larsbj@gullik.net> 2005-01-27 Lars Gullik Bjonnes <larsbj@gullik.net>
* Spacing (set): take double instead of float * Spacing (set): take double instead of float

View File

@ -15,6 +15,8 @@ bin_PROGRAMS = tex2lyx
AM_CPPFLAGS = $(PCH_FLAGS) -I$(srcdir)/.. $(BOOST_INCLUDES) AM_CPPFLAGS = $(PCH_FLAGS) -I$(srcdir)/.. $(BOOST_INCLUDES)
BOOST_LIBS = $(BOOST_REGEX) $(BOOST_FILESYSTEM)
BUILT_SOURCES = \ BUILT_SOURCES = \
FloatList.C \ FloatList.C \
Floating.C \ Floating.C \
@ -48,7 +50,7 @@ tex2lyx_SOURCES = \
tex2lyx_LDADD = \ tex2lyx_LDADD = \
$(top_builddir)/src/support/libsupport.la \ $(top_builddir)/src/support/libsupport.la \
$(BOOST_REGEX) -lz $(BOOST_LIBS) -lz
$(BUILT_SOURCES) : $(BUILT_SOURCES) :
@rm -f $@ ; \ @rm -f $@ ; \

View File

@ -20,12 +20,14 @@
#include "support/convert.h" #include "support/convert.h"
#include "support/filetools.h" #include "support/filetools.h"
#include "support/fs_extras.h"
#include "support/lstrings.h" #include "support/lstrings.h"
#include "support/lyxlib.h" #include "support/lyxlib.h"
#include "support/os.h" #include "support/os.h"
#include "support/package.h" #include "support/package.h"
#include <boost/function.hpp> #include <boost/function.hpp>
#include <boost/filesystem/operations.hpp>
#include <cctype> #include <cctype>
#include <fstream> #include <fstream>
@ -53,7 +55,9 @@ using lyx::support::isStrUnsignedInt;
using lyx::support::ltrim; using lyx::support::ltrim;
using lyx::support::rtrim; using lyx::support::rtrim;
using lyx::support::IsFileReadable; using lyx::support::IsFileReadable;
using lyx::support::IsFileWriteable;
namespace fs = boost::filesystem;
// Hacks to allow the thing to link in the lyxlayout stuff // Hacks to allow the thing to link in the lyxlayout stuff
LyXErr lyxerr(std::cerr.rdbuf()); LyXErr lyxerr(std::cerr.rdbuf());
@ -358,7 +362,7 @@ void tex2lyx(std::istream &is, std::ostream &os)
bool tex2lyx(string const &infilename, string const &outfilename) bool tex2lyx(string const &infilename, string const &outfilename)
{ {
if (!(IsFileReadable(infilename) && IsFileWriteable(outfilename))) { if (!(IsFileReadable(infilename) && fs::is_writable(outfilename))) {
return false; return false;
} }
if (!overwrite_files && IsFileReadable(outfilename)) { if (!overwrite_files && IsFileReadable(outfilename)) {

View File

@ -17,11 +17,11 @@
#include "context.h" #include "context.h"
#include "FloatList.h" #include "FloatList.h"
#include "lengthcommon.h" #include "lengthcommon.h"
#include "support/FileInfo.h"
#include "support/lstrings.h" #include "support/lstrings.h"
#include "support/convert.h" #include "support/convert.h"
#include "support/filetools.h" #include "support/filetools.h"
#include <boost/filesystem/operations.hpp>
#include <boost/tuple/tuple.hpp> #include <boost/tuple/tuple.hpp>
#include <iostream> #include <iostream>
@ -29,7 +29,6 @@
#include <sstream> #include <sstream>
#include <vector> #include <vector>
using lyx::support::FileInfo;
using lyx::support::MakeAbsPath; using lyx::support::MakeAbsPath;
using lyx::support::rtrim; using lyx::support::rtrim;
using lyx::support::suffixIs; using lyx::support::suffixIs;
@ -46,6 +45,8 @@ using std::istringstream;
using std::string; using std::string;
using std::vector; using std::vector;
namespace fs = boost::filesystem;
/// thin wrapper around parse_text using a string /// thin wrapper around parse_text using a string
string parse_text(Parser & p, unsigned flags, const bool outer, string parse_text(Parser & p, unsigned flags, const bool outer,
@ -316,7 +317,7 @@ string find_file(string const & name, string const & path,
// We don't use ChangeExtension() because it does the wrong // We don't use ChangeExtension() because it does the wrong
// thing if name contains a dot. // thing if name contains a dot.
string const trial = name + '.' + (*what); string const trial = name + '.' + (*what);
if (FileInfo(MakeAbsPath(trial, path)).exist()) if (fs::exists(MakeAbsPath(trial, path)))
return trial; return trial;
} }
return string(); return string();
@ -1162,7 +1163,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
string const path = getMasterFilePath(); string const path = getMasterFilePath();
// We want to preserve relative / absolute filenames, // We want to preserve relative / absolute filenames,
// therefore path is only used for testing // therefore path is only used for testing
if (!FileInfo(MakeAbsPath(name, path)).exist()) { if (!fs::exists(MakeAbsPath(name, path))) {
// The file extension is probably missing. // The file extension is probably missing.
// Now try to find it out. // Now try to find it out.
string const dvips_name = string const dvips_name =
@ -1191,7 +1192,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
} else if (!pdftex_name.empty()) } else if (!pdftex_name.empty())
name = pdftex_name; name = pdftex_name;
if (!FileInfo(MakeAbsPath(name, path)).exist()) if (!fs::exists(MakeAbsPath(name, path)))
cerr << "Warning: Could not find graphics file '" cerr << "Warning: Could not find graphics file '"
<< name << "'." << endl; << name << "'." << endl;
} }

View File

@ -14,12 +14,13 @@
#include "debug.h" #include "debug.h"
#include "buffer.h" #include "buffer.h"
#include "support/FileInfo.h"
#include "support/path.h" #include "support/path.h"
#include "support/filetools.h" #include "support/filetools.h"
#include "support/fs_extras.h"
#include "support/lstrings.h" #include "support/lstrings.h"
#include "support/systemcall.h" #include "support/systemcall.h"
#include <boost/filesystem/operations.hpp>
#include <boost/regex.hpp> #include <boost/regex.hpp>
#include <fstream> #include <fstream>
@ -27,7 +28,6 @@
using lyx::support::AddName; using lyx::support::AddName;
using lyx::support::AddPath; using lyx::support::AddPath;
using lyx::support::contains; using lyx::support::contains;
using lyx::support::FileInfo;
using lyx::support::OnlyFilename; using lyx::support::OnlyFilename;
using lyx::support::OnlyPath; using lyx::support::OnlyPath;
using lyx::support::Path; using lyx::support::Path;
@ -49,6 +49,8 @@ using std::getline;
using std::string; using std::string;
using std::ifstream; using std::ifstream;
namespace fs = boost::filesystem;
int VCS::doVCCommand(string const & cmd, string const & path) int VCS::doVCCommand(string const & cmd, string const & path)
{ {
@ -72,10 +74,9 @@ string const RCS::find_file(string const & file)
string tmp(file); string tmp(file);
// Check if *,v exists. // Check if *,v exists.
tmp += ",v"; tmp += ",v";
FileInfo f;
lyxerr[Debug::LYXVC] << "Checking if file is under rcs: " lyxerr[Debug::LYXVC] << "Checking if file is under rcs: "
<< tmp << endl; << tmp << endl;
if (f.newFile(tmp).readable()) { if (fs::is_readable(tmp)) {
lyxerr[Debug::LYXVC] << "Yes " << file lyxerr[Debug::LYXVC] << "Yes " << file
<< " is under rcs." << endl; << " is under rcs." << endl;
return tmp; return tmp;
@ -85,7 +86,7 @@ string const RCS::find_file(string const & file)
tmp += ",v"; tmp += ",v";
lyxerr[Debug::LYXVC] << "Checking if file is under rcs: " lyxerr[Debug::LYXVC] << "Checking if file is under rcs: "
<< tmp << endl; << tmp << endl;
if (f.newFile(tmp).readable()) { if (fs::is_readable(tmp)) {
lyxerr[Debug::LYXVC] << "Yes " << file lyxerr[Debug::LYXVC] << "Yes " << file
<< " it is under rcs."<< endl; << " it is under rcs."<< endl;
return tmp; return tmp;
@ -239,8 +240,7 @@ string const CVS::find_file(string const & file)
string const tmpf = "/" + OnlyFilename(file) + "/"; string const tmpf = "/" + OnlyFilename(file) + "/";
lyxerr[Debug::LYXVC] << "LyXVC: checking in `" << dir lyxerr[Debug::LYXVC] << "LyXVC: checking in `" << dir
<< "' for `" << tmpf << '\'' << endl; << "' for `" << tmpf << '\'' << endl;
FileInfo const f(dir); if (fs::is_readable(dir)) {
if (f.readable()) {
// Ok we are at least in a CVS dir. Parse the CVS/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 // and see if we can find this file. We do a fast and
// dirty parse here. // dirty parse here.
@ -280,9 +280,8 @@ void CVS::scanMaster()
//sm[4]; // options //sm[4]; // options
//sm[5]; // tag or tagdate //sm[5]; // tag or tagdate
FileInfo fi(file_);
// FIXME: must double check file is stattable/existing // FIXME: must double check file is stattable/existing
time_t mod = fi.getModificationTime(); time_t mod = fs::last_write_time(file_);
string mod_date = rtrim(asctime(gmtime(&mod)), "\n"); string mod_date = rtrim(asctime(gmtime(&mod)), "\n");
lyxerr[Debug::LYXVC] lyxerr[Debug::LYXVC]
<< "Date in Entries: `" << file_date << "Date in Entries: `" << file_date