2017-03-17 23:21:33 +03:00
|
|
|
/*
|
2019-06-20 02:58:25 +03:00
|
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
2017-03-17 23:21:33 +03:00
|
|
|
*
|
2019-06-20 02:58:25 +03:00
|
|
|
* This software may be used and distributed according to the terms of the
|
|
|
|
* GNU General Public License version 2.
|
2017-03-17 23:21:33 +03:00
|
|
|
*/
|
2019-10-11 15:26:59 +03:00
|
|
|
|
2017-10-26 02:49:58 +03:00
|
|
|
#include "eden/fs/model/TreeEntry.h"
|
2017-03-17 23:21:33 +03:00
|
|
|
|
2017-10-26 02:49:58 +03:00
|
|
|
#include <folly/Conv.h>
|
|
|
|
#include <folly/Range.h>
|
2018-05-01 07:20:51 +03:00
|
|
|
#include <folly/logging/xlog.h>
|
2018-02-17 02:35:30 +03:00
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <ostream>
|
2017-10-26 02:49:58 +03:00
|
|
|
|
2017-03-17 23:21:33 +03:00
|
|
|
namespace facebook {
|
|
|
|
namespace eden {
|
|
|
|
|
2018-02-17 02:35:30 +03:00
|
|
|
mode_t modeFromTreeEntryType(TreeEntryType ft) {
|
|
|
|
switch (ft) {
|
|
|
|
case TreeEntryType::TREE:
|
|
|
|
return S_IFDIR | 0755;
|
|
|
|
case TreeEntryType::REGULAR_FILE:
|
|
|
|
return S_IFREG | 0644;
|
|
|
|
case TreeEntryType::EXECUTABLE_FILE:
|
|
|
|
return S_IFREG | 0755;
|
|
|
|
case TreeEntryType::SYMLINK:
|
2019-12-11 01:04:02 +03:00
|
|
|
#ifdef _WIN32
|
|
|
|
// On Windows, we report symlinks as files. The behaviour here is same as
|
|
|
|
// Mercurial.
|
|
|
|
// TODO: would be nice to log some useful context here!
|
|
|
|
return S_IFREG | 0755;
|
|
|
|
#else
|
2018-02-17 02:35:30 +03:00
|
|
|
return S_IFLNK | 0755;
|
2019-12-11 01:04:02 +03:00
|
|
|
#endif
|
2018-02-17 02:35:30 +03:00
|
|
|
}
|
|
|
|
XLOG(FATAL) << "illegal file type " << static_cast<int>(ft);
|
|
|
|
}
|
|
|
|
|
2019-12-11 01:04:02 +03:00
|
|
|
#ifndef _WIN32
|
2018-10-24 03:03:11 +03:00
|
|
|
std::optional<TreeEntryType> treeEntryTypeFromMode(mode_t mode) {
|
2018-02-20 22:16:00 +03:00
|
|
|
if (S_ISREG(mode)) {
|
|
|
|
return mode & S_IXUSR ? TreeEntryType::EXECUTABLE_FILE
|
|
|
|
: TreeEntryType::REGULAR_FILE;
|
|
|
|
} else if (S_ISLNK(mode)) {
|
|
|
|
return TreeEntryType::SYMLINK;
|
|
|
|
} else if (S_ISDIR(mode)) {
|
|
|
|
return TreeEntryType::TREE;
|
|
|
|
} else {
|
2018-10-24 03:03:11 +03:00
|
|
|
return std::nullopt;
|
2018-02-20 22:16:00 +03:00
|
|
|
}
|
|
|
|
}
|
2018-08-22 03:50:48 +03:00
|
|
|
#endif
|
2018-02-20 22:16:00 +03:00
|
|
|
|
2017-10-26 02:49:58 +03:00
|
|
|
std::string TreeEntry::toLogString() const {
|
|
|
|
char fileTypeChar = '?';
|
2018-02-17 02:35:28 +03:00
|
|
|
switch (type_) {
|
|
|
|
case TreeEntryType::TREE:
|
2017-10-26 02:49:58 +03:00
|
|
|
fileTypeChar = 'd';
|
|
|
|
break;
|
2018-02-17 02:35:28 +03:00
|
|
|
case TreeEntryType::REGULAR_FILE:
|
2017-10-26 02:49:58 +03:00
|
|
|
fileTypeChar = 'f';
|
|
|
|
break;
|
2018-02-17 02:35:28 +03:00
|
|
|
case TreeEntryType::EXECUTABLE_FILE:
|
2018-02-16 01:23:07 +03:00
|
|
|
fileTypeChar = 'x';
|
|
|
|
break;
|
2018-02-17 02:35:28 +03:00
|
|
|
case TreeEntryType::SYMLINK:
|
2017-10-26 02:49:58 +03:00
|
|
|
fileTypeChar = 'l';
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return folly::to<std::string>(
|
2018-02-16 01:23:07 +03:00
|
|
|
"(", name_, ", ", hash_.toString(), ", ", fileTypeChar, ")");
|
|
|
|
}
|
|
|
|
|
2018-02-17 02:35:28 +03:00
|
|
|
std::ostream& operator<<(std::ostream& os, TreeEntryType type) {
|
2018-02-16 01:23:07 +03:00
|
|
|
switch (type) {
|
2018-02-17 02:35:28 +03:00
|
|
|
case TreeEntryType::TREE:
|
|
|
|
return os << "TREE";
|
|
|
|
case TreeEntryType::REGULAR_FILE:
|
2018-02-16 01:23:07 +03:00
|
|
|
return os << "REGULAR_FILE";
|
2018-02-17 02:35:28 +03:00
|
|
|
case TreeEntryType::EXECUTABLE_FILE:
|
2018-02-16 01:23:07 +03:00
|
|
|
return os << "EXECUTABLE_FILE";
|
2018-02-17 02:35:28 +03:00
|
|
|
case TreeEntryType::SYMLINK:
|
2018-02-16 01:23:07 +03:00
|
|
|
return os << "SYMLINK";
|
|
|
|
}
|
|
|
|
|
2018-02-17 02:35:28 +03:00
|
|
|
return os << "TreeEntryType::" << int(type);
|
2017-10-26 02:49:58 +03:00
|
|
|
}
|
|
|
|
|
2017-07-05 21:17:03 +03:00
|
|
|
bool operator==(const TreeEntry& entry1, const TreeEntry& entry2) {
|
|
|
|
return (entry1.getHash() == entry2.getHash()) &&
|
2018-02-17 02:35:28 +03:00
|
|
|
(entry1.getType() == entry2.getType()) &&
|
2017-07-05 21:17:03 +03:00
|
|
|
(entry1.getName() == entry2.getName());
|
|
|
|
}
|
|
|
|
|
|
|
|
bool operator!=(const TreeEntry& entry1, const TreeEntry& entry2) {
|
|
|
|
return !(entry1 == entry2);
|
|
|
|
}
|
2017-11-04 01:58:04 +03:00
|
|
|
} // namespace eden
|
|
|
|
} // namespace facebook
|