Merge branch 'maint'
* maint: GIT 1.6.0.4 Update RPM spec for the new location of git-cvsserver. push: fix local refs update if already up-to-date do not force write of packed refs Conflicts: builtin-revert.c
This commit is contained in:
commit
bc9c0248a5
@ -16,6 +16,9 @@ Fixes since v1.6.0.3
|
|||||||
* 'git push --mirror' tried and failed to push the stash; there is no
|
* 'git push --mirror' tried and failed to push the stash; there is no
|
||||||
point in sending it to begin with.
|
point in sending it to begin with.
|
||||||
|
|
||||||
|
* 'git push' did not update the remote tracking reference if the corresponding
|
||||||
|
ref on the remote end happened to be already up to date.
|
||||||
|
|
||||||
* 'git pull $there $branch:$current_branch' did not work when you were on
|
* 'git pull $there $branch:$current_branch' did not work when you were on
|
||||||
a branch yet to be born.
|
a branch yet to be born.
|
||||||
|
|
||||||
@ -29,12 +32,8 @@ Fixes since v1.6.0.3
|
|||||||
|
|
||||||
* 'git svn' used deprecated 'git-foo' form of subcommand invocaition.
|
* 'git svn' used deprecated 'git-foo' form of subcommand invocaition.
|
||||||
|
|
||||||
|
* 'git update-ref -d' to remove a reference did not honor --no-deref option.
|
||||||
|
|
||||||
* Plugged small memleaks here and there.
|
* Plugged small memleaks here and there.
|
||||||
|
|
||||||
* Also contains many documentation updates.
|
* Also contains many documentation updates.
|
||||||
|
|
||||||
--
|
|
||||||
exec >/var/tmp/1
|
|
||||||
O=v1.6.0.3-34-gf6276b7
|
|
||||||
echo O=$(git describe maint)
|
|
||||||
git shortlog --no-merges $O..maint
|
|
||||||
|
@ -230,7 +230,7 @@ static void update_tracking_ref(struct remote *remote, struct ref *ref)
|
|||||||
{
|
{
|
||||||
struct refspec rs;
|
struct refspec rs;
|
||||||
|
|
||||||
if (ref->status != REF_STATUS_OK)
|
if (ref->status != REF_STATUS_OK && ref->status != REF_STATUS_UPTODATE)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
rs.src = ref->name;
|
rs.src = ref->name;
|
||||||
@ -435,24 +435,19 @@ static int do_send_pack(int in, int out, struct remote *remote, const char *dest
|
|||||||
*/
|
*/
|
||||||
new_refs = 0;
|
new_refs = 0;
|
||||||
for (ref = remote_refs; ref; ref = ref->next) {
|
for (ref = remote_refs; ref; ref = ref->next) {
|
||||||
const unsigned char *new_sha1;
|
|
||||||
|
|
||||||
if (!ref->peer_ref) {
|
if (ref->peer_ref)
|
||||||
if (!args.send_mirror)
|
hashcpy(ref->new_sha1, ref->peer_ref->new_sha1);
|
||||||
continue;
|
else if (!args.send_mirror)
|
||||||
new_sha1 = null_sha1;
|
continue;
|
||||||
}
|
|
||||||
else
|
|
||||||
new_sha1 = ref->peer_ref->new_sha1;
|
|
||||||
|
|
||||||
|
ref->deletion = is_null_sha1(ref->new_sha1);
|
||||||
ref->deletion = is_null_sha1(new_sha1);
|
|
||||||
if (ref->deletion && !allow_deleting_refs) {
|
if (ref->deletion && !allow_deleting_refs) {
|
||||||
ref->status = REF_STATUS_REJECT_NODELETE;
|
ref->status = REF_STATUS_REJECT_NODELETE;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!ref->deletion &&
|
if (!ref->deletion &&
|
||||||
!hashcmp(ref->old_sha1, new_sha1)) {
|
!hashcmp(ref->old_sha1, ref->new_sha1)) {
|
||||||
ref->status = REF_STATUS_UPTODATE;
|
ref->status = REF_STATUS_UPTODATE;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -480,14 +475,13 @@ static int do_send_pack(int in, int out, struct remote *remote, const char *dest
|
|||||||
!ref->deletion &&
|
!ref->deletion &&
|
||||||
!is_null_sha1(ref->old_sha1) &&
|
!is_null_sha1(ref->old_sha1) &&
|
||||||
(!has_sha1_file(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) {
|
if (ref->nonfastforward && !ref->force && !args.force_update) {
|
||||||
ref->status = REF_STATUS_REJECT_NONFASTFORWARD;
|
ref->status = REF_STATUS_REJECT_NONFASTFORWARD;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
hashcpy(ref->new_sha1, new_sha1);
|
|
||||||
if (!ref->deletion)
|
if (!ref->deletion)
|
||||||
new_refs++;
|
new_refs++;
|
||||||
|
|
||||||
|
7
refs.c
7
refs.c
@ -795,10 +795,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;
|
||||||
@ -826,12 +826,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;
|
||||||
|
|
||||||
@ -845,7 +846,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 &&
|
||||||
|
@ -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' '
|
test_expect_success 'push does not update local refs on failure' '
|
||||||
|
|
||||||
rm -rf parent child &&
|
rm -rf parent child &&
|
||||||
|
Loading…
Reference in New Issue
Block a user