mirror of
https://github.com/facebook/sapling.git
synced 2024-10-05 14:28:17 +03:00
83 lines
2.4 KiB
C
83 lines
2.4 KiB
C
|
/*
|
||
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||
|
*
|
||
|
* This software may be used and distributed according to the terms of the
|
||
|
* GNU General Public License version 2.
|
||
|
*/
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
#ifdef _WIN32
|
||
|
|
||
|
#include <optional>
|
||
|
|
||
|
#include <folly/portability/Windows.h>
|
||
|
|
||
|
#include <winioctl.h> // @manual
|
||
|
|
||
|
#include "eden/fs/inodes/overlay/gen-cpp2/overlay_types.h"
|
||
|
#include "eden/fs/model/ObjectId.h"
|
||
|
#include "eden/fs/utils/DirType.h"
|
||
|
#include "eden/fs/utils/PathFuncs.h"
|
||
|
#include "eden/fs/utils/PathMap.h"
|
||
|
|
||
|
namespace facebook::eden {
|
||
|
|
||
|
/**
|
||
|
* Properties of a file or directory entry in a PrjFS virtualization root.
|
||
|
*
|
||
|
* TODO(mshroyer): Maybe factor out the overlay and scm-related properties used
|
||
|
* by Windows FSCK.
|
||
|
*/
|
||
|
struct FsckFileState {
|
||
|
bool onDisk = false;
|
||
|
// populatedOrFullOrTomb is true if:
|
||
|
// - a file is full, hydrated or tomstoned
|
||
|
// - a directory is full or a dirty placeholder or a descendant is
|
||
|
// populatedOrFullOrTomb
|
||
|
bool populatedOrFullOrTomb = false;
|
||
|
// diskEmptyPlaceholder is true if:
|
||
|
// - a file is virtual or a placeholder
|
||
|
// - a directory is a placeholder and has no children (placeholder or
|
||
|
// otherwise)
|
||
|
|
||
|
bool renamedPlaceholder = false;
|
||
|
|
||
|
bool diskEmptyPlaceholder = false;
|
||
|
bool directoryIsFull = false;
|
||
|
bool diskTombstone = false;
|
||
|
dtype_t diskDtype = dtype_t::Unknown;
|
||
|
|
||
|
bool inOverlay = false;
|
||
|
dtype_t overlayDtype = dtype_t::Unknown;
|
||
|
std::optional<ObjectId> overlayHash = std::nullopt;
|
||
|
std::optional<overlay::OverlayEntry> overlayEntry = std::nullopt;
|
||
|
|
||
|
bool inScm = false;
|
||
|
dtype_t scmDtype = dtype_t::Unknown;
|
||
|
std::optional<ObjectId> scmHash = std::nullopt;
|
||
|
|
||
|
bool shouldExist = false;
|
||
|
dtype_t desiredDtype = dtype_t::Unknown;
|
||
|
std::optional<ObjectId> desiredHash = std::nullopt;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Gets the state of entries on disk in a PrjFS virtualization root.
|
||
|
*
|
||
|
* Call with queryOnDiskEntriesOnly=true to use on a virtualization root while
|
||
|
* the virtualization provider is running. This ensures the flag
|
||
|
* FIND_FIRST_EX_ON_DISK_ENTRIES_ONLY is provided to FindFirstFileExW, which
|
||
|
* will prevent us from visiting and materializing virtual directory entries.
|
||
|
*/
|
||
|
PathMap<FsckFileState> getPrjfsOnDiskChildrenState(
|
||
|
AbsolutePathPiece root,
|
||
|
RelativePathPiece path,
|
||
|
bool windowsSymlinksEnabled,
|
||
|
bool fsckRenamedFiles,
|
||
|
bool queryOnDiskEntriesOnly);
|
||
|
|
||
|
} // namespace facebook::eden
|
||
|
|
||
|
#endif // defined _WIN32
|