summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dir.cpp1
-rw-r--r--src/repo.cpp12
-rw-r--r--src/repo.h1
-rw-r--r--unittests/core.cpp18
4 files changed, 21 insertions, 11 deletions
diff --git a/src/dir.cpp b/src/dir.cpp
index a825cc8..9142cb7 100644
--- a/src/dir.cpp
+++ b/src/dir.cpp
@@ -65,6 +65,7 @@ GitFS::Directory::listdir(const ::Ice::Current &)
{
const auto subTree = getSubtree();
NetFS::DirectoryContents list;
+ list.emplace(".", list.emplace("..", repo->getdirattr()).first->second);
for (auto idx = git_tree_entrycount(subTree.get()); idx--;) {
const auto entry = git_tree_entry_byindex(subTree.get(), idx);
list.emplace(git_tree_entry_name(entry), repo->getattr(entry));
diff --git a/src/repo.cpp b/src/repo.cpp
index db21e61..5a889ea 100644
--- a/src/repo.cpp
+++ b/src/repo.cpp
@@ -122,9 +122,7 @@ GitFS::Repo::getattr(ReqEnv, const ::std::string path, const ::Ice::Current &)
update();
if (path == "/") {
- NetFS::Attr attr = getattr(nullptr, nullptr);
- attr.mode = S_IFDIR | S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
- return attr;
+ return getdirattr();
}
return getattr(Git::treeEntryByPath(tree, path).get());
}
@@ -154,6 +152,14 @@ GitFS::Repo::getattr(const git_tree_entry * entry, const git_blob * blob) const
return attr;
}
+NetFS::Attr
+GitFS::Repo::getdirattr() const
+{
+ NetFS::Attr attr = getattr(nullptr, nullptr);
+ attr.mode = S_IFDIR | S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
+ return attr;
+}
+
::std::string
GitFS::Repo::readlink(ReqEnv, const ::std::string path, const ::Ice::Current &)
{
diff --git a/src/repo.h b/src/repo.h
index facf42e..ad004c4 100644
--- a/src/repo.h
+++ b/src/repo.h
@@ -32,6 +32,7 @@ namespace GitFS {
Attr getattr(ReqEnv env, ::std::string path, const ::Ice::Current & ice) override;
[[nodiscard]] Attr getattr(const git_tree_entry *) const;
[[nodiscard]] Attr getattr(const git_tree_entry *, const git_blob *) const;
+ [[nodiscard]] Attr getdirattr() const;
::std::string readlink(ReqEnv env, ::std::string path, const ::Ice::Current & ice) override;
FilePrxPtr open(ReqEnv env, ::std::string path, int flags, const ::Ice::Current & ice) override;
FilePrxPtr create(ReqEnv env, ::std::string path, int flags, int mode, const ::Ice::Current & ice) override;
diff --git a/unittests/core.cpp b/unittests/core.cpp
index f6a2341..4809d43 100644
--- a/unittests/core.cpp
+++ b/unittests/core.cpp
@@ -274,14 +274,16 @@ BOOST_DATA_TEST_CASE(openDirRead, DIRPATHS ^ DIRCONTENTS, path, contents)
dir->close();
}
-const auto DIRCONTENTMODES = btdata::make<std::vector<std::tuple<std::string, int>>>({
- {{".gitignore", FILEMODE}, {"Jamroot.jam", FILEMODE}, {"src", DIRMODE}, {"unittests", DIRMODE}},
- {{"Jamfile.jam", FILEMODE}, {"blob.cpp", FILEMODE}, {"blob.h", FILEMODE}, {"dir.cpp", FILEMODE},
- {"dir.h", FILEMODE}, {"git.cpp", FILEMODE}, {"git.h", FILEMODE}, {"main.cpp", FILEMODE},
- {"repo.cpp", FILEMODE}, {"repo.h", FILEMODE}, {"repoList.cpp", FILEMODE}, {"repoList.h", FILEMODE}},
- {{"Jamfile.jam", FILEMODE}, {"core.cpp", FILEMODE}, {"fixtures", DIRMODE}, {"mockDefs.cpp", FILEMODE},
- {"mockDefs.h", FILEMODE}},
- {{"executable", EXECMODE}, {"symlink", LINKMODE}},
+const auto DIRCONTENTMODES = btdata::make<std::vector<std::tuple<std::string, Ice::Int>>>({
+ {{".", DIRMODE}, {"..", DIRMODE}, {".gitignore", FILEMODE}, {"Jamroot.jam", FILEMODE}, {"src", DIRMODE},
+ {"unittests", DIRMODE}},
+ {{".", DIRMODE}, {"..", DIRMODE}, {"Jamfile.jam", FILEMODE}, {"blob.cpp", FILEMODE}, {"blob.h", FILEMODE},
+ {"dir.cpp", FILEMODE}, {"dir.h", FILEMODE}, {"git.cpp", FILEMODE}, {"git.h", FILEMODE},
+ {"main.cpp", FILEMODE}, {"repo.cpp", FILEMODE}, {"repo.h", FILEMODE}, {"repoList.cpp", FILEMODE},
+ {"repoList.h", FILEMODE}},
+ {{".", DIRMODE}, {"..", DIRMODE}, {"Jamfile.jam", FILEMODE}, {"core.cpp", FILEMODE}, {"fixtures", DIRMODE},
+ {"mockDefs.cpp", FILEMODE}, {"mockDefs.h", FILEMODE}},
+ {{".", DIRMODE}, {"..", DIRMODE}, {"executable", EXECMODE}, {"symlink", LINKMODE}},
});
BOOST_DATA_TEST_CASE(openDirList, DIRPATHS ^ DIRCONTENTMODES, path, contents)