Merge branch 'cb/maint-update-ref-fix' into maint

* cb/maint-update-ref-fix:
  push: fix local refs update if already up-to-date
  do not force write of packed refs
This commit is contained in:
Junio C Hamano 2008-11-08 17:32:49 -08:00
Родитель 2819854ec5 16ed2f48be
Коммит 832e719d79
4 изменённых файлов: 50 добавлений и 17 удалений

Просмотреть файл

@ -222,7 +222,7 @@ static void update_tracking_ref(struct remote *remote, struct ref *ref)
{
struct refspec rs;
if (ref->status != REF_STATUS_OK)
if (ref->status != REF_STATUS_OK && ref->status != REF_STATUS_UPTODATE)
return;
rs.src = ref->name;
@ -424,24 +424,19 @@ static int do_send_pack(int in, int out, struct remote *remote, const char *dest
*/
new_refs = 0;
for (ref = remote_refs; ref; ref = ref->next) {
const unsigned char *new_sha1;
if (!ref->peer_ref) {
if (!args.send_mirror)
continue;
new_sha1 = null_sha1;
}
else
new_sha1 = ref->peer_ref->new_sha1;
if (ref->peer_ref)
hashcpy(ref->new_sha1, ref->peer_ref->new_sha1);
else if (!args.send_mirror)
continue;
ref->deletion = is_null_sha1(new_sha1);
ref->deletion = is_null_sha1(ref->new_sha1);
if (ref->deletion && !allow_deleting_refs) {
ref->status = REF_STATUS_REJECT_NODELETE;
continue;
}
if (!ref->deletion &&
!hashcmp(ref->old_sha1, new_sha1)) {
!hashcmp(ref->old_sha1, ref->new_sha1)) {
ref->status = REF_STATUS_UPTODATE;
continue;
}
@ -469,14 +464,13 @@ static int do_send_pack(int in, int out, struct remote *remote, const char *dest
!ref->deletion &&
!is_null_sha1(ref->old_sha1) &&
(!has_sha1_file(ref->old_sha1)
|| !ref_newer(new_sha1, ref->old_sha1));
|| !ref_newer(ref->new_sha1, ref->old_sha1));
if (ref->nonfastforward && !ref->force && !args.force_update) {
ref->status = REF_STATUS_REJECT_NONFASTFORWARD;
continue;
}
hashcpy(ref->new_sha1, new_sha1);
if (!ref->deletion)
new_refs++;

7
refs.c
Просмотреть файл

@ -789,10 +789,10 @@ static struct ref_lock *lock_ref_sha1_basic(const char *ref, const unsigned char
char *ref_file;
const char *orig_ref = ref;
struct ref_lock *lock;
struct stat st;
int last_errno = 0;
int type, lflags;
int mustexist = (old_sha1 && !is_null_sha1(old_sha1));
int missing = 0;
lock = xcalloc(1, sizeof(struct ref_lock));
lock->lock_fd = -1;
@ -820,12 +820,13 @@ static struct ref_lock *lock_ref_sha1_basic(const char *ref, const unsigned char
orig_ref, strerror(errno));
goto error_return;
}
missing = is_null_sha1(lock->old_sha1);
/* When the ref did not exist and we are creating it,
* make sure there is no existing ref that is packed
* whose name begins with our refname, nor a ref whose
* 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))
goto error_return;
@ -839,7 +840,7 @@ static struct ref_lock *lock_ref_sha1_basic(const char *ref, const unsigned char
lock->ref_name = xstrdup(ref);
lock->orig_ref_name = xstrdup(orig_ref);
ref_file = git_path("%s", ref);
if (lstat(ref_file, &st) && errno == ENOENT)
if (missing)
lock->force_write = 1;
if ((flags & REF_NODEREF) && (type & REF_ISSYMREF))
lock->force_write = 1;

Просмотреть файл

@ -96,6 +96,13 @@ test_expect_success \
git branch -d n/o/p &&
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' '
git tag foo &&
git pack-refs --all --prune &&

Просмотреть файл

@ -437,6 +437,37 @@ test_expect_success 'push updates local refs' '
'
test_expect_success 'push updates up-to-date local refs' '
rm -rf parent child &&
mkdir parent &&
(cd parent && git init &&
echo one >foo && git add foo && git commit -m one) &&
git clone parent child1 &&
git clone parent child2 &&
(cd child1 &&
echo two >foo && git commit -a -m two &&
git push) &&
(cd child2 &&
git pull ../child1 master &&
git push &&
test $(git rev-parse master) = $(git rev-parse remotes/origin/master))
'
test_expect_success 'push preserves up-to-date packed refs' '
rm -rf parent child &&
mkdir parent &&
(cd parent && git init &&
echo one >foo && git add foo && git commit -m one) &&
git clone parent child &&
(cd child &&
git push &&
! test -f .git/refs/remotes/origin/master)
'
test_expect_success 'push does not update local refs on failure' '
rm -rf parent child &&