From 5bdd8d4a3062ac8f29ec511fecb85049f6ff3ecc Mon Sep 17 00:00:00 2001 From: Clemens Buchacher Date: Wed, 5 Nov 2008 21:55:53 +0100 Subject: 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 Signed-off-by: Junio C Hamano --- refs.c | 7 ++++--- t/t3210-pack-refs.sh | 7 +++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/refs.c b/refs.c index 9e422dcccb..7d91b670c5 100644 --- a/refs.c +++ b/refs.c @@ -788,10 +788,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; @@ -819,12 +819,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; @@ -838,7 +839,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; diff --git a/t/t3210-pack-refs.sh b/t/t3210-pack-refs.sh index 087ef75061..413019acaf 100755 --- a/t/t3210-pack-refs.sh +++ b/t/t3210-pack-refs.sh @@ -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 && -- cgit v1.2.3 From 16ed2f48be228918af3d1a6c5a6a4fe9b832cb84 Mon Sep 17 00:00:00 2001 From: Clemens Buchacher Date: Wed, 5 Nov 2008 21:55:54 +0100 Subject: push: fix local refs update if already up-to-date git push normally updates local refs only after a successful push. If the remote already has the updates -- pushed indirectly through another repository, for example -- we forget to update local tracking refs. Signed-off-by: Clemens Buchacher Signed-off-by: Junio C Hamano --- builtin-send-pack.c | 22 ++++++++-------------- t/t5516-fetch-push.sh | 31 +++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/builtin-send-pack.c b/builtin-send-pack.c index 301f230432..8fdeaa3989 100644 --- a/builtin-send-pack.c +++ b/builtin-send-pack.c @@ -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++; diff --git a/t/t5516-fetch-push.sh b/t/t5516-fetch-push.sh index f0030ad00e..598664ce7f 100755 --- a/t/t5516-fetch-push.sh +++ b/t/t5516-fetch-push.sh @@ -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 && -- cgit v1.2.3 From ee5391c73efaf6dea06f769157fa1650d0bdce31 Mon Sep 17 00:00:00 2001 From: Quy Tonthat Date: Sat, 13 Sep 2008 02:22:44 +1000 Subject: Update RPM spec for the new location of git-cvsserver. git-cvsserver has been moved from libexecdir to bindir. Signed-off-by: Quy Tonthat Signed-off-by: Junio C Hamano --- git.spec.in | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/git.spec.in b/git.spec.in index c6492e5be2..6733b6f555 100644 --- a/git.spec.in +++ b/git.spec.in @@ -145,6 +145,7 @@ rm -rf $RPM_BUILD_ROOT %files cvs %defattr(-,root,root) %doc Documentation/*git-cvs*.txt +%{_bindir}/git-cvsserver %{_libexecdir}/git-core/*cvs* %{!?_without_docs: %{_mandir}/man1/*cvs*.1*} %{!?_without_docs: %doc Documentation/*git-cvs*.html } @@ -188,6 +189,9 @@ rm -rf $RPM_BUILD_ROOT # No files for you! %changelog +* Fri Sep 12 2008 Quy Tonthat +- move git-cvsserver to bindir. + * Sun Jun 15 2008 Junio C Hamano - Remove curl from Requires list. -- cgit v1.2.3 From 7c181d627c136cbc67ef0f722e74e34017e662f0 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Sat, 8 Nov 2008 17:33:50 -0800 Subject: GIT 1.6.0.4 Signed-off-by: Junio C Hamano --- Documentation/RelNotes-1.6.0.4.txt | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Documentation/RelNotes-1.6.0.4.txt b/Documentation/RelNotes-1.6.0.4.txt index db1002e8c7..fba3f30a89 100644 --- a/Documentation/RelNotes-1.6.0.4.txt +++ b/Documentation/RelNotes-1.6.0.4.txt @@ -16,6 +16,9 @@ Fixes since v1.6.0.3 * 'git push --mirror' tried and failed to push the stash; there is no 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 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 update-ref -d' to remove a reference did not honor --no-deref option. + * Plugged small memleaks here and there. * 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 -- cgit v1.2.3