From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS31976 209.132.180.0/23 X-Spam-Status: No, score=-2.4 required=3.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,RCVD_IN_DNSWL_HI,RCVD_IN_SORBS_SPAM, RP_MATCHES_RCVD,T_DKIM_INVALID shortcircuit=no autolearn=no autolearn_force=no version=3.4.0 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by dcvr.yhbt.net (Postfix) with ESMTP id C2742207D6 for ; Tue, 25 Apr 2017 00:04:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S979335AbdDYAEm (ORCPT ); Mon, 24 Apr 2017 20:04:42 -0400 Received: from mail-wr0-f196.google.com ([209.85.128.196]:36021 "EHLO mail-wr0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S979221AbdDYAEl (ORCPT ); Mon, 24 Apr 2017 20:04:41 -0400 Received: by mail-wr0-f196.google.com with SMTP id v42so14630771wrc.3 for ; Mon, 24 Apr 2017 17:04:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id; bh=1uhTYfgKokNY24jt1IBzGVfmp8QnE0CThv/YR1OutzI=; b=iC/EUtMPFE3FGGLw2rShBEN6M8MIoBEHtaHlZHV47aJbEBjVVmULOz9deW3nvneFr6 0Y0OnYeoJFKHa44C8envS3q0ZAqeutbvfdilU76kmkDHRQT8cb+rbBuVvWFIXi88EguR D0JHkW4Cj0prSFO3KLvl2TvaHVaZPxR3A6snC61wp1Y0KRACUVI1czJVl5u3VsqP2Io1 /7Sn/fEk/+uke7VO3rPxPL8ku84gKM1FiKbxNmSaQ6QVAaWaS43x5ohg8MEq+bY40+Ty N8Tf8BWMahloEoLDuLTaVbDTz43bvggQBnccUYzcmwAn1eTx8pY9+zIfd7r7PYoblI8O sItg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id; bh=1uhTYfgKokNY24jt1IBzGVfmp8QnE0CThv/YR1OutzI=; b=RE2aC3Beqw0+ZRwULpdphwD9yvMBRPCweprGFOxtBi6HAoy29wAvj8cZGOds+PTJLR ZcsS5aIZBf6stpmdalb/xIjaqp65GwxwmZ/cNF/Qa3Ts9jwEBap1/pO/r9dw6RjRalQH D6ByOO/9Ni6ryqf1MKsWD/Nzz8SyyPOGzMmSV/P13/mn/AXabZulCbQEpL4EtymJnwO5 5unlZ/cZlGA2rzLYg/lvzKH9sxRLlai/6Pya5KLgBw/RJnEZ6s281aY0v9InRqugAHPw uaCfoRqvVvYZhthsyDkYjzUPGI6dIU9XDD7gXFNvwitaBTgUZD08Z40surSAz8Kv0EfF XDsw== X-Gm-Message-State: AN3rC/54ZGX/mL+shPIW6ipjpXgxWhymZX83emZzk4w1jnJnPItUHox6 a9s7jo7NoNBqLQ== X-Received: by 10.223.176.83 with SMTP id g19mr7431458wra.12.1493078680438; Mon, 24 Apr 2017 17:04:40 -0700 (PDT) Received: from localhost.localdomain (66.red-88-8-179.dynamicip.rima-tde.net. [88.8.179.66]) by smtp.gmail.com with ESMTPSA id a5sm1917228wma.28.2017.04.24.17.04.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 24 Apr 2017 17:04:39 -0700 (PDT) From: Miguel Torroja To: git@vger.kernel.org Cc: Miguel Torroja Subject: [PATCH 1/2] fast-export: deletion action first Date: Tue, 25 Apr 2017 02:04:27 +0200 Message-Id: <1493078668-1354-1-git-send-email-miguel.torroja@gmail.com> X-Mailer: git-send-email 2.1.4 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org The delete operations of the fast-export output should precede any addition belonging to the same commit, Addition and deletion with the same name entry could happen in case of file to directory and viceversa. The fast-export sorting was added in 060df62 (fast-export: Fix output order of D/F changes). That change was made in order to fix the case of directory to file in the same commit, but it broke the reverse case (File to directory). Signed-off-by: Miguel Torroja --- builtin/fast-export.c | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/builtin/fast-export.c b/builtin/fast-export.c index e022063..a3ab7da 100644 --- a/builtin/fast-export.c +++ b/builtin/fast-export.c @@ -260,26 +260,19 @@ static void export_blob(const struct object_id *oid) free(buf); } -static int depth_first(const void *a_, const void *b_) +/* + * Compares two diff types to order based on output priorities. + */ +static int diff_type_cmp(const void *a_, const void *b_) { const struct diff_filepair *a = *((const struct diff_filepair **)a_); const struct diff_filepair *b = *((const struct diff_filepair **)b_); - const char *name_a, *name_b; - int len_a, len_b, len; int cmp; - name_a = a->one ? a->one->path : a->two->path; - name_b = b->one ? b->one->path : b->two->path; - - len_a = strlen(name_a); - len_b = strlen(name_b); - len = (len_a < len_b) ? len_a : len_b; - - /* strcmp will sort 'd' before 'd/e', we want 'd/e' before 'd' */ - cmp = memcmp(name_a, name_b, len); - if (cmp) - return cmp; - cmp = len_b - len_a; + /* + * Move Delete entries first so that an addition is always reported after + */ + cmp = (b->status == DIFF_STATUS_DELETED) - (a->status == DIFF_STATUS_DELETED); if (cmp) return cmp; /* @@ -347,7 +340,7 @@ static void show_filemodify(struct diff_queue_struct *q, * Handle files below a directory first, in case they are all deleted * and the directory changes to a file or symlink. */ - QSORT(q->queue, q->nr, depth_first); + QSORT(q->queue, q->nr, diff_type_cmp); for (i = 0; i < q->nr; i++) { struct diff_filespec *ospec = q->queue[i]->one; -- 2.1.4