зеркало из https://github.com/microsoft/git.git
gvfs: block unsupported commands when running in a GVFS repo
The following commands and options are not currently supported when working in a GVFS repo. Add code to detect and block these commands from executing. 1) fsck 2) gc 4) prune 5) repack 6) submodule 8) update-index --split-index 9) update-index --index-version (other than 4) 10) update-index --[no-]skip-worktree 11) worktree Signed-off-by: Ben Peart <benpeart@microsoft.com>
This commit is contained in:
Родитель
330d7cc591
Коммит
0aa5176bc1
|
@ -12,6 +12,7 @@
|
|||
|
||||
#include "builtin.h"
|
||||
#include "repository.h"
|
||||
#include "gvfs.h"
|
||||
#include "config.h"
|
||||
#include "tempfile.h"
|
||||
#include "lockfile.h"
|
||||
|
@ -610,6 +611,9 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
|
|||
if (quiet)
|
||||
strvec_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.
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
*/
|
||||
#define USE_THE_INDEX_COMPATIBILITY_MACROS
|
||||
#include "cache.h"
|
||||
#include "gvfs.h"
|
||||
#include "bulk-checkin.h"
|
||||
#include "config.h"
|
||||
#include "lockfile.h"
|
||||
|
@ -1170,7 +1171,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",
|
||||
|
@ -1211,6 +1218,9 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
|
|||
end_odb_transaction();
|
||||
|
||||
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 "
|
||||
|
|
15
git.c
15
git.c
|
@ -1,4 +1,5 @@
|
|||
#include "builtin.h"
|
||||
#include "gvfs.h"
|
||||
#include "config.h"
|
||||
#include "exec-cmd.h"
|
||||
#include "help.h"
|
||||
|
@ -19,6 +20,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;
|
||||
|
@ -521,6 +523,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");
|
||||
|
||||
|
@ -606,7 +611,7 @@ static struct cmd_struct commands[] = {
|
|||
{ "for-each-ref", cmd_for_each_ref, RUN_SETUP },
|
||||
{ "for-each-repo", cmd_for_each_repo, RUN_SETUP_GENTLY },
|
||||
{ "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 },
|
||||
{ "fsmonitor--daemon", cmd_fsmonitor__daemon, SUPPORT_SUPER_PREFIX | RUN_SETUP },
|
||||
{ "gc", cmd_gc, RUN_SETUP },
|
||||
|
@ -647,7 +652,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 },
|
||||
|
@ -659,7 +664,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 },
|
||||
|
@ -679,7 +684,7 @@ static struct cmd_struct commands[] = {
|
|||
{ "stash", cmd_stash, RUN_SETUP | NEED_WORK_TREE },
|
||||
{ "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 },
|
||||
{ "switch", cmd_switch, RUN_SETUP | NEED_WORK_TREE },
|
||||
{ "symbolic-ref", cmd_symbolic_ref, RUN_SETUP },
|
||||
{ "tag", cmd_tag, RUN_SETUP | DELAY_PAGER_CONFIG },
|
||||
|
@ -697,7 +702,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 },
|
||||
{ "worktree", cmd_worktree, RUN_SETUP | BLOCK_ON_GVFS_REPO },
|
||||
{ "write-tree", cmd_write_tree, RUN_SETUP },
|
||||
};
|
||||
|
||||
|
|
1
gvfs.h
1
gvfs.h
|
@ -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)
|
||||
|
|
|
@ -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' '
|
||||
test_config core.gvfs true &&
|
||||
test_config gc.auto 0 &&
|
||||
git gc --auto
|
||||
'
|
||||
|
||||
test_done
|
Загрузка…
Ссылка в новой задаче