Skip to content

Commit db31631

Browse files
mjcheethamdscho
authored andcommitted
Permit repack command in Scalar clones (#732)
Currently when the `core.gvfs` setting is set, several commands are outright blocked from running. Some of these commands, namely `repack` are actually OK to run in a Scalar clone, even if it uses the GVFS protocol (for Azure DevOps). Introduce a different blocking mechanism to only block commands when the virtual filesystem is being used, rather than as a broad block on any `core.gvfs` setting.
2 parents 84c8769 + cb6463c commit db31631

File tree

5 files changed

+27
-13
lines changed

5 files changed

+27
-13
lines changed

builtin/repack.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "pack-bitmap.h"
2525
#include "refs.h"
2626
#include "list-objects-filter-options.h"
27+
#include "gvfs.h"
2728

2829
#define ALL_INTO_ONE 1
2930
#define LOOSEN_UNREACHABLE 2
@@ -1243,7 +1244,7 @@ static const char *find_pack_prefix(const char *packdir, const char *packtmp)
12431244
int cmd_repack(int argc,
12441245
const char **argv,
12451246
const char *prefix,
1246-
struct repository *repo UNUSED)
1247+
struct repository *repo)
12471248
{
12481249
struct child_process cmd = CHILD_PROCESS_INIT;
12491250
struct string_list_item *item;
@@ -1255,6 +1256,7 @@ int cmd_repack(int argc,
12551256
int show_progress;
12561257
char **midx_pack_names = NULL;
12571258
size_t midx_pack_names_nr = 0;
1259+
const char *tmp_obj_dir = NULL;
12581260

12591261
/* variables to be filled by option parsing */
12601262
int delete_redundant = 0;
@@ -1384,6 +1386,10 @@ int cmd_repack(int argc,
13841386
write_bitmaps = 0;
13851387
}
13861388

1389+
if (gvfs_config_is_set(repo, GVFS_ANY_MASK) &&
1390+
!repo_config_get_value(repo, "gvfs.sharedcache", &tmp_obj_dir))
1391+
warning(_("shared object cache is configured but will not be repacked"));
1392+
13871393
if (write_midx && write_bitmaps) {
13881394
struct strbuf path = STRBUF_INIT;
13891395

builtin/worktree.c

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1451,13 +1451,6 @@ int cmd_worktree(int ac,
14511451

14521452
repo_config(the_repository, git_worktree_config, NULL);
14531453

1454-
/*
1455-
* git-worktree is special-cased to work in Scalar repositories
1456-
* even when they use the GVFS Protocol.
1457-
*/
1458-
if (gvfs_config_is_set(repo, GVFS_USE_VIRTUAL_FILESYSTEM))
1459-
die("'git %s' is not supported on a GVFS repo", "worktree");
1460-
14611454
if (!prefix)
14621455
prefix = "";
14631456

git.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#define DELAY_PAGER_CONFIG (1<<4)
3333
#define NO_PARSEOPT (1<<5) /* parse-options is not used */
3434
#define BLOCK_ON_GVFS_REPO (1<<6) /* command not allowed in GVFS repos */
35+
#define BLOCK_ON_VFS_ENABLED (1<<7) /* command not allowed when virtual file system is used */
3536

3637
struct cmd_struct {
3738
const char *cmd;
@@ -542,6 +543,9 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv, struct
542543
if (!help && p->option & BLOCK_ON_GVFS_REPO && gvfs_config_is_set(repo, GVFS_BLOCK_COMMANDS))
543544
die("'git %s' is not supported on a GVFS repo", p->cmd);
544545

546+
if (!help && p->option & BLOCK_ON_VFS_ENABLED && gvfs_config_is_set(repo, GVFS_USE_VIRTUAL_FILESYSTEM))
547+
die("'git %s' is not supported when using the virtual file system", p->cmd);
548+
545549
if (run_pre_command_hook(the_repository, argv))
546550
die("pre-command hook aborted command");
547551

@@ -626,7 +630,7 @@ static struct cmd_struct commands[] = {
626630
{ "for-each-ref", cmd_for_each_ref, RUN_SETUP },
627631
{ "for-each-repo", cmd_for_each_repo, RUN_SETUP_GENTLY },
628632
{ "format-patch", cmd_format_patch, RUN_SETUP },
629-
{ "fsck", cmd_fsck, RUN_SETUP | BLOCK_ON_GVFS_REPO},
633+
{ "fsck", cmd_fsck, RUN_SETUP | BLOCK_ON_VFS_ENABLED },
630634
{ "fsck-objects", cmd_fsck, RUN_SETUP },
631635
{ "fsmonitor--daemon", cmd_fsmonitor__daemon, RUN_SETUP },
632636
{ "gc", cmd_gc, RUN_SETUP },
@@ -669,7 +673,7 @@ static struct cmd_struct commands[] = {
669673
{ "pack-refs", cmd_pack_refs, RUN_SETUP },
670674
{ "patch-id", cmd_patch_id, RUN_SETUP_GENTLY | NO_PARSEOPT },
671675
{ "pickaxe", cmd_blame, RUN_SETUP },
672-
{ "prune", cmd_prune, RUN_SETUP | BLOCK_ON_GVFS_REPO},
676+
{ "prune", cmd_prune, RUN_SETUP | BLOCK_ON_VFS_ENABLED },
673677
{ "prune-packed", cmd_prune_packed, RUN_SETUP },
674678
{ "pull", cmd_pull, RUN_SETUP | NEED_WORK_TREE },
675679
{ "push", cmd_push, RUN_SETUP },
@@ -682,7 +686,7 @@ static struct cmd_struct commands[] = {
682686
{ "remote", cmd_remote, RUN_SETUP },
683687
{ "remote-ext", cmd_remote_ext, NO_PARSEOPT },
684688
{ "remote-fd", cmd_remote_fd, NO_PARSEOPT },
685-
{ "repack", cmd_repack, RUN_SETUP | BLOCK_ON_GVFS_REPO },
689+
{ "repack", cmd_repack, RUN_SETUP | BLOCK_ON_VFS_ENABLED },
686690
{ "replace", cmd_replace, RUN_SETUP },
687691
{ "replay", cmd_replay, RUN_SETUP },
688692
{ "rerere", cmd_rerere, RUN_SETUP },
@@ -725,7 +729,7 @@ static struct cmd_struct commands[] = {
725729
#ifndef WITH_BREAKING_CHANGES
726730
{ "whatchanged", cmd_whatchanged, RUN_SETUP },
727731
#endif
728-
{ "worktree", cmd_worktree, RUN_SETUP },
732+
{ "worktree", cmd_worktree, RUN_SETUP | BLOCK_ON_VFS_ENABLED },
729733
{ "write-tree", cmd_write_tree, RUN_SETUP },
730734
};
731735

gvfs.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ struct repository;
3030
#define GVFS_BLOCK_FILTERS_AND_EOL_CONVERSIONS (1 << 6)
3131
#define GVFS_PREFETCH_DURING_FETCH (1 << 7)
3232

33+
#define GVFS_ANY_MASK 0xFFFFFFFF
34+
3335
int gvfs_config_is_set(struct repository *r, int mask);
3436
int gvfs_virtualize_objects(struct repository *r);
3537

t/t0402-block-command-on-gvfs.sh

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ not_with_gvfs fsck
2222
not_with_gvfs gc
2323
not_with_gvfs gc --auto
2424
not_with_gvfs prune
25-
not_with_gvfs repack
2625
not_with_gvfs submodule status
2726
not_with_gvfs update-index --index-version 2
2827
not_with_gvfs update-index --skip-worktree
@@ -36,4 +35,14 @@ test_expect_success 'test gc --auto succeeds when disabled via config' '
3635
git gc --auto
3736
'
3837

38+
test_expect_success 'test repack fails with VFS bit enabled' '
39+
test_config core.gvfs true &&
40+
test_must_fail git repack
41+
'
42+
43+
test_expect_success 'test repack succeeds with VFS bit disabled' '
44+
test_config core.gvfs 150 &&
45+
git repack
46+
'
47+
3948
test_done

0 commit comments

Comments
 (0)