зеркало из https://github.com/microsoft/git.git
do not force write of packed refs
We force writing a ref if it does not exist. Originally, we only had to look for the ref file to check if it existed. Now we have to look for a packed ref as well. Luckily, resolve_ref already does all the work for us. Signed-off-by: Clemens Buchacher <drizzd@aon.at> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
16088d8870
Коммит
5bdd8d4a30
7
refs.c
7
refs.c
|
@ -788,10 +788,10 @@ static struct ref_lock *lock_ref_sha1_basic(const char *ref, const unsigned char
|
||||||
char *ref_file;
|
char *ref_file;
|
||||||
const char *orig_ref = ref;
|
const char *orig_ref = ref;
|
||||||
struct ref_lock *lock;
|
struct ref_lock *lock;
|
||||||
struct stat st;
|
|
||||||
int last_errno = 0;
|
int last_errno = 0;
|
||||||
int type, lflags;
|
int type, lflags;
|
||||||
int mustexist = (old_sha1 && !is_null_sha1(old_sha1));
|
int mustexist = (old_sha1 && !is_null_sha1(old_sha1));
|
||||||
|
int missing = 0;
|
||||||
|
|
||||||
lock = xcalloc(1, sizeof(struct ref_lock));
|
lock = xcalloc(1, sizeof(struct ref_lock));
|
||||||
lock->lock_fd = -1;
|
lock->lock_fd = -1;
|
||||||
|
@ -819,12 +819,13 @@ static struct ref_lock *lock_ref_sha1_basic(const char *ref, const unsigned char
|
||||||
orig_ref, strerror(errno));
|
orig_ref, strerror(errno));
|
||||||
goto error_return;
|
goto error_return;
|
||||||
}
|
}
|
||||||
|
missing = is_null_sha1(lock->old_sha1);
|
||||||
/* When the ref did not exist and we are creating it,
|
/* When the ref did not exist and we are creating it,
|
||||||
* make sure there is no existing ref that is packed
|
* make sure there is no existing ref that is packed
|
||||||
* whose name begins with our refname, nor a ref whose
|
* whose name begins with our refname, nor a ref whose
|
||||||
* name is a proper prefix of our refname.
|
* name is a proper prefix of our refname.
|
||||||
*/
|
*/
|
||||||
if (is_null_sha1(lock->old_sha1) &&
|
if (missing &&
|
||||||
!is_refname_available(ref, NULL, get_packed_refs(), 0))
|
!is_refname_available(ref, NULL, get_packed_refs(), 0))
|
||||||
goto error_return;
|
goto error_return;
|
||||||
|
|
||||||
|
@ -838,7 +839,7 @@ static struct ref_lock *lock_ref_sha1_basic(const char *ref, const unsigned char
|
||||||
lock->ref_name = xstrdup(ref);
|
lock->ref_name = xstrdup(ref);
|
||||||
lock->orig_ref_name = xstrdup(orig_ref);
|
lock->orig_ref_name = xstrdup(orig_ref);
|
||||||
ref_file = git_path("%s", ref);
|
ref_file = git_path("%s", ref);
|
||||||
if (lstat(ref_file, &st) && errno == ENOENT)
|
if (missing)
|
||||||
lock->force_write = 1;
|
lock->force_write = 1;
|
||||||
if ((flags & REF_NODEREF) && (type & REF_ISSYMREF))
|
if ((flags & REF_NODEREF) && (type & REF_ISSYMREF))
|
||||||
lock->force_write = 1;
|
lock->force_write = 1;
|
||||||
|
|
|
@ -96,6 +96,13 @@ test_expect_success \
|
||||||
git branch -d n/o/p &&
|
git branch -d n/o/p &&
|
||||||
git branch n'
|
git branch n'
|
||||||
|
|
||||||
|
test_expect_success \
|
||||||
|
'see if up-to-date packed refs are preserved' \
|
||||||
|
'git branch q &&
|
||||||
|
git pack-refs --all --prune &&
|
||||||
|
git update-ref refs/heads/q refs/heads/q &&
|
||||||
|
! test -f .git/refs/heads/q'
|
||||||
|
|
||||||
test_expect_success 'pack, prune and repack' '
|
test_expect_success 'pack, prune and repack' '
|
||||||
git tag foo &&
|
git tag foo &&
|
||||||
git pack-refs --all --prune &&
|
git pack-refs --all --prune &&
|
||||||
|
|
Загрузка…
Ссылка в новой задаче