Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gvfs: block unsupported commands when running in a GVFS repo #91

Merged
merged 1 commit into from
Dec 13, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions builtin/gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#include "pack-objects.h"
#include "blob.h"
#include "tree.h"
#include "gvfs.h"

#define FAILED_RUN "failed to run %s"

Expand Down Expand Up @@ -565,6 +566,9 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
if (quiet)
argv_array_push(&repack, "-q");

if ((!auto_gc || (auto_gc && gc_auto_threshold > 0)) && gvfs_config_is_set(GVFS_BLOCK_COMMANDS))
die(_("'git gc' is not supported on a GVFS repo"));

if (auto_gc) {
/*
* Auto-gc should be least intrusive as possible.
Expand Down
10 changes: 10 additions & 0 deletions builtin/update-index.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include "dir.h"
#include "split-index.h"
#include "fsmonitor.h"
#include "gvfs.h"

/*
* Default to not allowing changes to the list of files. The
Expand Down Expand Up @@ -1115,7 +1116,13 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
argc = parse_options_end(&ctx);

getline_fn = nul_term_line ? strbuf_getline_nul : strbuf_getline_lf;
if (mark_skip_worktree_only && gvfs_config_is_set(GVFS_BLOCK_COMMANDS))
die(_("modifying the skip worktree bit is not supported on a GVFS repo"));

if (preferred_index_format) {
if (preferred_index_format != 4 && gvfs_config_is_set(GVFS_BLOCK_COMMANDS))
die(_("changing the index version is not supported on a GVFS repo"));

if (preferred_index_format < INDEX_FORMAT_LB ||
INDEX_FORMAT_UB < preferred_index_format)
die("index-version %d not in range: %d..%d",
Expand Down Expand Up @@ -1151,6 +1158,9 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
}

if (split_index > 0) {
if (gvfs_config_is_set(GVFS_BLOCK_COMMANDS))
die(_("split index is not supported on a GVFS repo"));

if (git_config_get_split_index() == 0)
warning(_("core.splitIndex is set to false; "
"remove or change it, if you really want to "
Expand Down
15 changes: 10 additions & 5 deletions git.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include "run-command.h"
#include "alias.h"
#include "dir.h"
#include "gvfs.h"

#define RUN_SETUP (1<<0)
#define RUN_SETUP_GENTLY (1<<1)
Expand All @@ -17,6 +18,7 @@
#define SUPPORT_SUPER_PREFIX (1<<4)
#define DELAY_PAGER_CONFIG (1<<5)
#define NO_PARSEOPT (1<<6) /* parse-options is not used */
#define BLOCK_ON_GVFS_REPO (1<<7) /* command not allowed in GVFS repos */

struct cmd_struct {
const char *cmd;
Expand Down Expand Up @@ -487,6 +489,9 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
if (!help && p->option & NEED_WORK_TREE)
setup_work_tree();

if (!help && p->option & BLOCK_ON_GVFS_REPO && gvfs_config_is_set(GVFS_BLOCK_COMMANDS))
die("'git %s' is not supported on a GVFS repo", p->cmd);

if (run_pre_command_hook(argv))
die("pre-command hook aborted command");

Expand Down Expand Up @@ -561,7 +566,7 @@ static struct cmd_struct commands[] = {
{ "fmt-merge-msg", cmd_fmt_merge_msg, RUN_SETUP },
{ "for-each-ref", cmd_for_each_ref, RUN_SETUP },
{ "format-patch", cmd_format_patch, RUN_SETUP },
{ "fsck", cmd_fsck, RUN_SETUP },
{ "fsck", cmd_fsck, RUN_SETUP | BLOCK_ON_GVFS_REPO},
{ "fsck-objects", cmd_fsck, RUN_SETUP },
{ "gc", cmd_gc, RUN_SETUP },
{ "get-tar-commit-id", cmd_get_tar_commit_id, NO_PARSEOPT },
Expand Down Expand Up @@ -599,7 +604,7 @@ static struct cmd_struct commands[] = {
{ "pack-refs", cmd_pack_refs, RUN_SETUP },
{ "patch-id", cmd_patch_id, RUN_SETUP_GENTLY | NO_PARSEOPT },
{ "pickaxe", cmd_blame, RUN_SETUP },
{ "prune", cmd_prune, RUN_SETUP },
{ "prune", cmd_prune, RUN_SETUP | BLOCK_ON_GVFS_REPO},
{ "prune-packed", cmd_prune_packed, RUN_SETUP },
{ "pull", cmd_pull, RUN_SETUP | NEED_WORK_TREE },
{ "push", cmd_push, RUN_SETUP },
Expand All @@ -617,7 +622,7 @@ static struct cmd_struct commands[] = {
{ "remote", cmd_remote, RUN_SETUP },
{ "remote-ext", cmd_remote_ext, NO_PARSEOPT },
{ "remote-fd", cmd_remote_fd, NO_PARSEOPT },
{ "repack", cmd_repack, RUN_SETUP },
{ "repack", cmd_repack, RUN_SETUP | BLOCK_ON_GVFS_REPO },
{ "replace", cmd_replace, RUN_SETUP },
{ "rerere", cmd_rerere, RUN_SETUP },
{ "reset", cmd_reset, RUN_SETUP },
Expand All @@ -641,7 +646,7 @@ static struct cmd_struct commands[] = {
{ "stash", cmd_stash },
{ "status", cmd_status, RUN_SETUP | NEED_WORK_TREE },
{ "stripspace", cmd_stripspace },
{ "submodule--helper", cmd_submodule__helper, RUN_SETUP | SUPPORT_SUPER_PREFIX | NO_PARSEOPT },
{ "submodule--helper", cmd_submodule__helper, RUN_SETUP | SUPPORT_SUPER_PREFIX | NO_PARSEOPT | BLOCK_ON_GVFS_REPO },
{ "symbolic-ref", cmd_symbolic_ref, RUN_SETUP },
{ "tag", cmd_tag, RUN_SETUP | DELAY_PAGER_CONFIG },
{ "unpack-file", cmd_unpack_file, RUN_SETUP | NO_PARSEOPT },
Expand All @@ -658,7 +663,7 @@ static struct cmd_struct commands[] = {
{ "verify-tag", cmd_verify_tag, RUN_SETUP },
{ "version", cmd_version },
{ "whatchanged", cmd_whatchanged, RUN_SETUP },
{ "worktree", cmd_worktree, RUN_SETUP | NO_PARSEOPT },
{ "worktree", cmd_worktree, RUN_SETUP | NO_PARSEOPT | BLOCK_ON_GVFS_REPO },
{ "write-tree", cmd_write_tree, RUN_SETUP },
};

Expand Down
1 change: 1 addition & 0 deletions gvfs.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
* The list of bits in the core_gvfs setting
*/
#define GVFS_SKIP_SHA_ON_INDEX (1 << 0)
#define GVFS_BLOCK_COMMANDS (1 << 1)
#define GVFS_MISSING_OK (1 << 2)
#define GVFS_NO_DELETE_OUTSIDE_SPARSECHECKOUT (1 << 3)
#define GVFS_FETCH_SKIP_REACHABILITY_AND_UPLOADPACK (1 << 4)
Expand Down
39 changes: 39 additions & 0 deletions t/t0402-block-command-on-gvfs.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#!/bin/sh

test_description='block commands in GVFS repo'

. ./test-lib.sh

not_with_gvfs () {
command=$1 &&
shift &&
test_expect_success "test $command $*" "
test_config alias.g4rbled $command &&
test_config core.gvfs true &&
test_must_fail git $command $* &&
test_must_fail git g4rbled $* &&
test_unconfig core.gvfs &&
test_must_fail git -c core.gvfs=true $command $* &&
test_must_fail git -c core.gvfs=true g4rbled $*
"
}

not_with_gvfs fsck
not_with_gvfs gc
not_with_gvfs gc --auto
not_with_gvfs prune
not_with_gvfs repack
not_with_gvfs submodule status
not_with_gvfs update-index --index-version 2
not_with_gvfs update-index --skip-worktree
not_with_gvfs update-index --no-skip-worktree
not_with_gvfs update-index --split-index
not_with_gvfs worktree list

test_expect_success 'test gc --auto succeeds when disabled via config' '
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like this test! Let's also get VFS functional tests before we merge. We will also want to retest the CI builds after #90 merges.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The VFS functional tests are available in this PR:
microsoft/VFSForGit#597

test_config core.gvfs true &&
test_config gc.auto 0 &&
git gc --auto
'

test_done