mirror of
https://github.com/git-for-windows/git.git
synced 2026-04-21 15:30:15 -05:00
fixup! fsmonitor--daemon: add pathname classification
This reverts commit 89265708a0.
Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
This commit is contained in:
committed by
Johannes Schindelin
parent
1be0de12a3
commit
d27ea8bbab
@@ -121,87 +121,6 @@ static int handle_client(void *data,
|
||||
return result;
|
||||
}
|
||||
|
||||
#define FSMONITOR_COOKIE_PREFIX ".fsmonitor-daemon-"
|
||||
|
||||
enum fsmonitor_path_type fsmonitor_classify_path_workdir_relative(
|
||||
const char *rel)
|
||||
{
|
||||
if (fspathncmp(rel, ".git", 4))
|
||||
return IS_WORKDIR_PATH;
|
||||
rel += 4;
|
||||
|
||||
if (!*rel)
|
||||
return IS_DOT_GIT;
|
||||
if (*rel != '/')
|
||||
return IS_WORKDIR_PATH; /* e.g. .gitignore */
|
||||
rel++;
|
||||
|
||||
if (!fspathncmp(rel, FSMONITOR_COOKIE_PREFIX,
|
||||
strlen(FSMONITOR_COOKIE_PREFIX)))
|
||||
return IS_INSIDE_DOT_GIT_WITH_COOKIE_PREFIX;
|
||||
|
||||
return IS_INSIDE_DOT_GIT;
|
||||
}
|
||||
|
||||
enum fsmonitor_path_type fsmonitor_classify_path_gitdir_relative(
|
||||
const char *rel)
|
||||
{
|
||||
if (!fspathncmp(rel, FSMONITOR_COOKIE_PREFIX,
|
||||
strlen(FSMONITOR_COOKIE_PREFIX)))
|
||||
return IS_INSIDE_GITDIR_WITH_COOKIE_PREFIX;
|
||||
|
||||
return IS_INSIDE_GITDIR;
|
||||
}
|
||||
|
||||
static enum fsmonitor_path_type try_classify_workdir_abs_path(
|
||||
struct fsmonitor_daemon_state *state,
|
||||
const char *path)
|
||||
{
|
||||
const char *rel;
|
||||
|
||||
if (fspathncmp(path, state->path_worktree_watch.buf,
|
||||
state->path_worktree_watch.len))
|
||||
return IS_OUTSIDE_CONE;
|
||||
|
||||
rel = path + state->path_worktree_watch.len;
|
||||
|
||||
if (!*rel)
|
||||
return IS_WORKDIR_PATH; /* it is the root dir exactly */
|
||||
if (*rel != '/')
|
||||
return IS_OUTSIDE_CONE;
|
||||
rel++;
|
||||
|
||||
return fsmonitor_classify_path_workdir_relative(rel);
|
||||
}
|
||||
|
||||
enum fsmonitor_path_type fsmonitor_classify_path_absolute(
|
||||
struct fsmonitor_daemon_state *state,
|
||||
const char *path)
|
||||
{
|
||||
const char *rel;
|
||||
enum fsmonitor_path_type t;
|
||||
|
||||
t = try_classify_workdir_abs_path(state, path);
|
||||
if (state->nr_paths_watching == 1)
|
||||
return t;
|
||||
if (t != IS_OUTSIDE_CONE)
|
||||
return t;
|
||||
|
||||
if (fspathncmp(path, state->path_gitdir_watch.buf,
|
||||
state->path_gitdir_watch.len))
|
||||
return IS_OUTSIDE_CONE;
|
||||
|
||||
rel = path + state->path_gitdir_watch.len;
|
||||
|
||||
if (!*rel)
|
||||
return IS_GITDIR; /* it is the <gitdir> exactly */
|
||||
if (*rel != '/')
|
||||
return IS_OUTSIDE_CONE;
|
||||
rel++;
|
||||
|
||||
return fsmonitor_classify_path_gitdir_relative(rel);
|
||||
}
|
||||
|
||||
static void *fsm_listen__thread_proc(void *_state)
|
||||
{
|
||||
struct fsmonitor_daemon_state *state = _state;
|
||||
|
||||
@@ -30,66 +30,5 @@ struct fsmonitor_daemon_state {
|
||||
struct ipc_server_data *ipc_server_data;
|
||||
};
|
||||
|
||||
/*
|
||||
* Pathname classifications.
|
||||
*
|
||||
* The daemon classifies the pathnames that it receives from file
|
||||
* system notification events into the following categories and uses
|
||||
* that to decide whether clients are told about them. (And to watch
|
||||
* for file system synchronization events.)
|
||||
*
|
||||
* The client should only care about paths within the working
|
||||
* directory proper (inside the working directory and not ".git" nor
|
||||
* inside of ".git/"). That is, the client has read the index and is
|
||||
* asking for a list of any paths in the working directory that have
|
||||
* been modified since the last token. The client does not care about
|
||||
* file system changes within the .git directory (such as new loose
|
||||
* objects or packfiles). So the client will only receive paths that
|
||||
* are classified as IS_WORKDIR_PATH.
|
||||
*
|
||||
* The daemon uses the IS_DOT_GIT and IS_GITDIR internally to mean the
|
||||
* exact ".git" directory or GITDIR. If the daemon receives a delete
|
||||
* event for either of these directories, it will automatically
|
||||
* shutdown, for example.
|
||||
*
|
||||
* Note that the daemon DOES NOT explicitly watch nor special case the
|
||||
* ".git/index" file. The daemon does not read the index and does not
|
||||
* have any internal index-relative state. The daemon only collects
|
||||
* the set of modified paths within the working directory.
|
||||
*/
|
||||
enum fsmonitor_path_type {
|
||||
IS_WORKDIR_PATH = 0,
|
||||
|
||||
IS_DOT_GIT,
|
||||
IS_INSIDE_DOT_GIT,
|
||||
IS_INSIDE_DOT_GIT_WITH_COOKIE_PREFIX,
|
||||
|
||||
IS_GITDIR,
|
||||
IS_INSIDE_GITDIR,
|
||||
IS_INSIDE_GITDIR_WITH_COOKIE_PREFIX,
|
||||
|
||||
IS_OUTSIDE_CONE,
|
||||
};
|
||||
|
||||
/*
|
||||
* Classify a pathname relative to the root of the working directory.
|
||||
*/
|
||||
enum fsmonitor_path_type fsmonitor_classify_path_workdir_relative(
|
||||
const char *relative_path);
|
||||
|
||||
/*
|
||||
* Classify a pathname relative to a <gitdir> that is external to the
|
||||
* worktree directory.
|
||||
*/
|
||||
enum fsmonitor_path_type fsmonitor_classify_path_gitdir_relative(
|
||||
const char *relative_path);
|
||||
|
||||
/*
|
||||
* Classify an absolute pathname received from a filesystem event.
|
||||
*/
|
||||
enum fsmonitor_path_type fsmonitor_classify_path_absolute(
|
||||
struct fsmonitor_daemon_state *state,
|
||||
const char *path);
|
||||
|
||||
#endif /* HAVE_FSMONITOR_DAEMON_BACKEND */
|
||||
#endif /* FSMONITOR_DAEMON_H */
|
||||
|
||||
Reference in New Issue
Block a user