Signed-off-by: Stefan Beller <[email protected]>
---
Notes:
When this patch series is applied, you only have 3 occurences of
force_write.
1. In the struct as an undocumented int.
2. In lock_ref_sha1_basic:
if ((flags & REF_NODEREF) && (type & REF_ISSYMREF))
lock->force_write = 1;
3: In ref_transaction_commit:
/* Perform updates first so live commits remain referenced */
for (i = 0; i < n; i++) {
struct ref_update *update = updates[i];
if (!is_null_sha1(update->new_sha1)) {
if (!update->lock->force_write &&
!hashcmp(update->lock->old_sha1, update->new_sha1))
{
unlock_ref(update->lock);
update->lock = NULL;
} else if (write_ref_sha1(update->lock,
update->new_sha1,
update->msg)) {
update->lock = NULL; /* freed by write_ref_sha1
*/
strbuf_addf(err, "Cannot update the ref '%s'.",
update->refname);
ret = TRANSACTION_GENERIC_ERROR;
goto cleanup;
} else {
/* freed by write_ref_sha1(): */
update->lock = NULL;
}
}
}
So maybe we can solve it even more elegant by omiting the first 2
occurences and
directly check the type and flags in ref_transaction_commit.
Maybe this makes sense to go on top of that series?
Thanks,
Stefan
refs.c | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/refs.c b/refs.c
index 3fcf342..ae24502 100644
--- a/refs.c
+++ b/refs.c
@@ -12,7 +12,6 @@ struct ref_lock {
struct lock_file *lk;
unsigned char old_sha1[20];
int lock_fd;
- int force_write;
};
/*
@@ -2319,8 +2318,6 @@ static struct ref_lock *lock_ref_sha1_basic(const char
*refname,
lock->ref_name = xstrdup(refname);
lock->orig_ref_name = xstrdup(orig_refname);
ref_file = git_path("%s", refname);
- if ((flags & REF_NODEREF) && (type & REF_ISSYMREF))
- lock->force_write = 1;
retry:
switch (safe_create_leading_directories(ref_file)) {
@@ -3788,8 +3785,10 @@ int ref_transaction_commit(struct ref_transaction
*transaction,
struct ref_update *update = updates[i];
if (!is_null_sha1(update->new_sha1)) {
- if (!update->lock->force_write &&
- !hashcmp(update->lock->old_sha1, update->new_sha1))
{
+ /* Ignore symbolic links when told not to dereference */
+ if (!((update->type & REF_ISSYMREF)
+ && (update->flags & REF_NODEREF))
+ && !hashcmp(update->lock->old_sha1,
update->new_sha1)) {
unlock_ref(update->lock);
update->lock = NULL;
} else if (write_ref_sha1(update->lock,
update->new_sha1,
--
2.2.1.62.g3f15098
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html