Signed-off-by: Stefan Beller <sbel...@google.com>
---

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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to