Skip to content

Commit

Permalink
gvfs: add the feature that blobs may be missing
Browse files Browse the repository at this point in the history
Signed-off-by: Kevin Willford <kewillf@microsoft.com>
  • Loading branch information
Kevin Willford authored and dscho committed Aug 11, 2023
1 parent a85c1cb commit b0c66c5
Show file tree
Hide file tree
Showing 5 changed files with 20 additions and 3 deletions.
4 changes: 4 additions & 0 deletions Documentation/config/core.txt
Original file line number Diff line number Diff line change
Expand Up @@ -737,6 +737,10 @@ core.gvfs::
GVFS_SKIP_SHA_ON_INDEX::
Bit value 1
Disables the calculation of the sha when writing the index
GVFS_MISSING_OK::
Bit value 4
Normally git write-tree ensures that the objects referenced by the
directory exist in the object database. This option disables this check.
--

core.sparseCheckout::
Expand Down
4 changes: 3 additions & 1 deletion cache-tree.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include "git-compat-util.h"
#include "environment.h"
#include "hex.h"
#include "gvfs.h"
#include "lockfile.h"
#include "tree.h"
#include "tree-walk.h"
Expand Down Expand Up @@ -258,7 +259,8 @@ static int update_one(struct cache_tree *it,
int flags)
{
struct strbuf buffer;
int missing_ok = flags & WRITE_TREE_MISSING_OK;
int missing_ok = gvfs_config_is_set(GVFS_MISSING_OK) ?
WRITE_TREE_MISSING_OK : (flags & WRITE_TREE_MISSING_OK);
int dryrun = flags & WRITE_TREE_DRY_RUN;
int repair = flags & WRITE_TREE_REPAIR;
int to_invalidate = 0;
Expand Down
9 changes: 7 additions & 2 deletions commit.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "git-compat-util.h"
#include "gvfs.h"
#include "tag.h"
#include "commit.h"
#include "commit-graph.h"
Expand Down Expand Up @@ -560,13 +561,17 @@ int repo_parse_commit_internal(struct repository *r,
.sizep = &size,
.contentp = &buffer,
};
int ret;
/*
* Git does not support partial clones that exclude commits, so set
* OBJECT_INFO_SKIP_FETCH_OBJECT to fail fast when an object is missing.
*/
int flags = OBJECT_INFO_LOOKUP_REPLACE | OBJECT_INFO_SKIP_FETCH_OBJECT |
OBJECT_INFO_DIE_IF_CORRUPT;
int ret;
OBJECT_INFO_DIE_IF_CORRUPT;

/* But the GVFS Protocol _does_ support missing commits! */
if (gvfs_config_is_set(GVFS_MISSING_OK))
flags ^= OBJECT_INFO_SKIP_FETCH_OBJECT;

if (!item)
return -1;
Expand Down
1 change: 1 addition & 0 deletions gvfs.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
* The list of bits in the core_gvfs setting
*/
#define GVFS_SKIP_SHA_ON_INDEX (1 << 0)
#define GVFS_MISSING_OK (1 << 2)

static inline int gvfs_config_is_set(int mask) {
return (core_gvfs & mask) == mask;
Expand Down
5 changes: 5 additions & 0 deletions t/t0000-basic.sh
Original file line number Diff line number Diff line change
Expand Up @@ -1106,6 +1106,11 @@ test_expect_success 'writing this tree with --missing-ok' '
git write-tree --missing-ok
'

test_expect_success 'writing this tree with missing ok config value' '
git config core.gvfs 4 &&
git write-tree
'


################################################################
test_expect_success 'git read-tree followed by write-tree should be idempotent' '
Expand Down

0 comments on commit b0c66c5

Please sign in to comment.