From patchwork Sat Mar 30 22:49:01 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Matheus Tavares X-Patchwork-Id: 10878611 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id C44BB18A6 for ; Sat, 30 Mar 2019 22:49:30 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id AFBA428683 for ; Sat, 30 Mar 2019 22:49:30 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A3CC9286CB; Sat, 30 Mar 2019 22:49:30 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 721D928692 for ; Sat, 30 Mar 2019 22:49:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731013AbfC3WtW (ORCPT ); Sat, 30 Mar 2019 18:49:22 -0400 Received: from mail-qt1-f193.google.com ([209.85.160.193]:37559 "EHLO mail-qt1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730666AbfC3WtW (ORCPT ); Sat, 30 Mar 2019 18:49:22 -0400 Received: by mail-qt1-f193.google.com with SMTP id z16so6772091qtn.4 for ; Sat, 30 Mar 2019 15:49:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=usp-br.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=NiCRl9E184AC0nezd5RzjQnNgANF2yTHWJBF21CgeeE=; b=oOVuimadWgBDEqVt4D76uqPWVnXeCRE91m08riCw6o7pwOVHjdrosHZqcs928p7Q5u dGkW/fcTv098xKBZ2+1JyPUzA7triwxAc4mOInaBI6LiDHesZ1OSD85dUrlA3JV8AZP0 KUjD9Wsa3le56LcC9gU5B3k0k5EJ6Vd4EdDw6YcjGNA57aXf6LDN6mSiIb4fEjWVXqks OJ1IrLNbjS71X264+FoFMTe5rMNrxKQsDwunXkiUMLhNepsA31PFfzn9Wyopw93/h0+C UEcYOT1fC27uFYyZR+uxU6EmVJ3+5vdbsp9v6bCT3qzjkUHjQyzKpVQx1oMG7BAGDb1I nKag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=NiCRl9E184AC0nezd5RzjQnNgANF2yTHWJBF21CgeeE=; b=DzOoWIX/dbC11XKMVJFteXnxHt8nwQvkjCbiqIj8amwEt1GrByaOZgBK+8arl82Np5 vuGKdWGCt7KfK3VD5T22Yz9DfycOUiSE6R9O1ORtI4KIWtj7uojVY7M1zpjWdmASeA75 VSTGf3Qj33AC2sBQu6KDo50WzalBaesvZ8vrDitUg5oFPB8d6tAF2uSxAZ3x5MMHVL0Y e2nFuZtoDoPllnmUpOqp3lgyVaMCHPtfx3Qlx9STuzbIebe5yBFz7rWuZVP+CdtFwUpe aPctUoqkM7dGvB5kNALl/RroNl1xtn5i/o0Es50okh9Oi5DhZ2QnsF6l9uxfSItoRdWk 81pw== X-Gm-Message-State: APjAAAWiszCOR3tV/cxBEqy4tmH5H7maYWdNTCrfpHVpTHKAyaeyFGho QGKR02LEJ6ALkJg05e9uQZNeEn8axyw= X-Google-Smtp-Source: APXvYqyeNBXOILhhpBMKhlywru9OPjkLa1yJ8ZWA0cHl3dxt4FytGHyD/5kc2g2nrLBcI6aDSWTE6g== X-Received: by 2002:ac8:168c:: with SMTP id r12mr48242956qtj.300.1553986160617; Sat, 30 Mar 2019 15:49:20 -0700 (PDT) Received: from mango.spo.virtua.com.br ([2804:14c:81:942d::4]) by smtp.gmail.com with ESMTPSA id x191sm3139943qka.78.2019.03.30.15.49.17 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 30 Mar 2019 15:49:20 -0700 (PDT) From: Matheus Tavares To: Junio C Hamano Cc: git@vger.kernel.org, Thomas Gummerer , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= , Christian Couder , =?utf-8?b?Tmd1eeG7hW4gVGg=?= =?utf-8?b?w6FpIE5n4buNYyBEdXk=?= , =?utf-8?q?SZEDER_G?= =?utf-8?q?=C3=A1bor?= , kernel-usp@googlegroups.com, Alex Riesen Subject: [GSoC][PATCH v5 1/7] clone: test for our behavior on odd objects/* content Date: Sat, 30 Mar 2019 19:49:01 -0300 Message-Id: <20190330224907.3277-2-matheus.bernardino@usp.br> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190330224907.3277-1-matheus.bernardino@usp.br> References: <20190322232237.13293-1-matheus.bernardino@usp.br> <20190330224907.3277-1-matheus.bernardino@usp.br> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Ævar Arnfjörð Bjarmason Add tests for what happens when we perform a local clone on a repo containing odd files at .git/object directory, such as symlinks to other dirs, or unknown files. I'm bending over backwards here to avoid a SHA-1 dependency. See [1] for an earlier and simpler version that hardcoded SHA-1s. This behavior has been the same for a *long* time, but hasn't been tested for. There's a good post-hoc argument to be made for copying over unknown things, e.g. I'd like a git version that doesn't know about the commit-graph to copy it under "clone --local" so a newer git version can make use of it. In follow-up commits we'll look at changing some of this behavior, but for now, let's just assert it as-is so we'll notice what we'll change later. 1. https://public-inbox.org/git/20190226002625.13022-5-avarab@gmail.com/ Signed-off-by: Ævar Arnfjörð Bjarmason [matheus.bernardino: improved and split tests in more than one patch] Helped-by: Matheus Tavares Signed-off-by: Matheus Tavares --- t/t5604-clone-reference.sh | 111 +++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/t/t5604-clone-reference.sh b/t/t5604-clone-reference.sh index 4320082b1b..207650cb95 100755 --- a/t/t5604-clone-reference.sh +++ b/t/t5604-clone-reference.sh @@ -221,4 +221,115 @@ test_expect_success 'clone, dissociate from alternates' ' ( cd C && git fsck ) ' +test_expect_success 'setup repo with garbage in objects/*' ' + git init S && + ( + cd S && + test_commit A && + + cd .git/objects && + >.some-hidden-file && + >some-file && + mkdir .some-hidden-dir && + >.some-hidden-dir/some-file && + >.some-hidden-dir/.some-dot-file && + mkdir some-dir && + >some-dir/some-file && + >some-dir/.some-dot-file + ) +' + +test_expect_success 'clone a repo with garbage in objects/*' ' + for option in --local --no-hardlinks --shared --dissociate + do + git clone $option S S$option || return 1 && + git -C S$option fsck || return 1 + done && + find S-* -name "*some*" | sort >actual && + cat >expected <<-EOF && + S--dissociate/.git/objects/.some-hidden-file + S--dissociate/.git/objects/some-dir + S--dissociate/.git/objects/some-dir/.some-dot-file + S--dissociate/.git/objects/some-dir/some-file + S--dissociate/.git/objects/some-file + S--local/.git/objects/.some-hidden-file + S--local/.git/objects/some-dir + S--local/.git/objects/some-dir/.some-dot-file + S--local/.git/objects/some-dir/some-file + S--local/.git/objects/some-file + S--no-hardlinks/.git/objects/.some-hidden-file + S--no-hardlinks/.git/objects/some-dir + S--no-hardlinks/.git/objects/some-dir/.some-dot-file + S--no-hardlinks/.git/objects/some-dir/some-file + S--no-hardlinks/.git/objects/some-file + EOF + test_cmp expected actual +' + +test_expect_success SYMLINKS 'setup repo with manually symlinked dirs and unknown files at objects/' ' + git init T && + ( + cd T && + git config gc.auto 0 && + test_commit A && + git gc && + test_commit B && + + cd .git/objects && + mv pack packs && + ln -s packs pack && + find ?? -type d >loose-dirs && + last_loose=$(tail -n 1 loose-dirs) && + rm -f loose-dirs && + mv $last_loose a-loose-dir && + ln -s a-loose-dir $last_loose && + find . -type f | sort >../../../T.objects-files.raw && + echo unknown_content> unknown_file + ) && + git -C T fsck && + git -C T rev-list --all --objects >T.objects +' + + +test_expect_success SYMLINKS 'clone repo with symlinked dirs and unknown files at objects/' ' + for option in --local --no-hardlinks --shared --dissociate + do + git clone $option T T$option || return 1 && + git -C T$option fsck || return 1 && + git -C T$option rev-list --all --objects >T$option.objects && + test_cmp T.objects T$option.objects && + ( + cd T$option/.git/objects && + find . -type f | sort >../../../T$option.objects-files.raw + ) + done && + + for raw in $(ls T*.raw) + do + sed -e "s!/../!/Y/!; s![0-9a-f]\{38,\}!Z!" -e "/commit-graph/d" \ + -e "/multi-pack-index/d" <$raw >$raw.de-sha || return 1 + done && + + cat >expected-files <<-EOF && + ./Y/Z + ./Y/Z + ./a-loose-dir/Z + ./Y/Z + ./info/packs + ./pack/pack-Z.idx + ./pack/pack-Z.pack + ./packs/pack-Z.idx + ./packs/pack-Z.pack + ./unknown_file + EOF + + for option in --local --dissociate --no-hardlinks + do + test_cmp expected-files T$option.objects-files.raw.de-sha || return 1 + done && + + echo ./info/alternates >expected-files && + test_cmp expected-files T--shared.objects-files.raw +' + test_done From patchwork Sat Mar 30 22:49:03 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matheus Tavares X-Patchwork-Id: 10878619 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 809351708 for ; Sat, 30 Mar 2019 22:49:36 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6BAF228683 for ; Sat, 30 Mar 2019 22:49:36 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5FCEC286AD; Sat, 30 Mar 2019 22:49:36 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B7C1B28683 for ; Sat, 30 Mar 2019 22:49:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731024AbfC3Wt2 (ORCPT ); Sat, 30 Mar 2019 18:49:28 -0400 Received: from mail-qt1-f194.google.com ([209.85.160.194]:42365 "EHLO mail-qt1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730666AbfC3Wt2 (ORCPT ); Sat, 30 Mar 2019 18:49:28 -0400 Received: by mail-qt1-f194.google.com with SMTP id p20so6492525qtc.9 for ; Sat, 30 Mar 2019 15:49:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=usp-br.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=lFwzYyS24Sj7uW4/YpI3WSwS0fZiSiLROyQBRdvQzL8=; b=b7i3uuk6jL/lpxPIuAgWTvj55kOMXdWHeTUXc8rET7ynfeKeExDGLtBcEzOlsgmlTH g6d+utubmFmXG1qH7OjrSMxGVID/Rcd2sG5gd9VLip831sYC/4pgQbvAgbYMF6cZ4R+k kRS94DTVF2RxIS3HxdL5Ruhp+zViiOYE5t+A4qMF68VSlVm5sfSGzkeOeWbCfymLv6LN UopsP1x1C5QyYW03+8XXbHKZLg5EA1xkt2D17xczwofUhkiVIJXrumPuM+9EG58zsO0v YvPrUo1JqPnY6syfK7okxM5hc9D16iwDIGTKUuX8RNByMLbEIQWbi0/U1XjRvkQPF4Wi N6yA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=lFwzYyS24Sj7uW4/YpI3WSwS0fZiSiLROyQBRdvQzL8=; b=kyL066bWc1EohqYP6LsmBLpTImLmq2pOmhEVC3/gTklSjilVPg6SqOFbVUQHPbFM4i L4pbjisVs+DHI5TsOdmIIAtaBYyiHYVL1xiHqTsH4kXqWdhA5DBpVphRQoNXDixDVOxn iAxBOotO3zfTfuM85Zfyb4cA7etmr2ops7hPu6lRmmgBZn8iiAGwvGVHU4nwEbILsnT8 A2ZEUznlFDkxjozHkKHNIEK207IuJ490gCM8zUAgn5qVny0Pszq09xbw3J61GF0wTvmb lKbGrHmPaRy+Ua6ziKoDyvmXp2v1tdRIVeku/AqVU9ZLREz1IufBhMH4aVcsAAscq+bu vuFw== X-Gm-Message-State: APjAAAUYXCjFhZPhJjDW+DQBkgaMC0desZF1gNCVUwq0qcHIiUZQFhdI zU5juGC0zutZJFIscAcsoL1N5w== X-Google-Smtp-Source: APXvYqwiOA0cHNI8yjcSH/ZilWO22SPVE73F9u22O8utmB2VPpivZOdIaPNnUy3xqUPHQPhciAmj2A== X-Received: by 2002:ac8:2427:: with SMTP id c36mr47544598qtc.124.1553986167410; Sat, 30 Mar 2019 15:49:27 -0700 (PDT) Received: from mango.spo.virtua.com.br ([2804:14c:81:942d::4]) by smtp.gmail.com with ESMTPSA id x191sm3139943qka.78.2019.03.30.15.49.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 30 Mar 2019 15:49:26 -0700 (PDT) From: Matheus Tavares To: Junio C Hamano Cc: git@vger.kernel.org, Thomas Gummerer , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= , Christian Couder , =?utf-8?b?Tmd1eeG7hW4gVGg=?= =?utf-8?b?w6FpIE5n4buNYyBEdXk=?= , =?utf-8?q?SZEDER_G?= =?utf-8?q?=C3=A1bor?= , kernel-usp@googlegroups.com, Michael Haggerty , Ramsay Jones Subject: [GSoC][PATCH v5 3/7] dir-iterator: add flags parameter to dir_iterator_begin Date: Sat, 30 Mar 2019 19:49:03 -0300 Message-Id: <20190330224907.3277-4-matheus.bernardino@usp.br> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190330224907.3277-1-matheus.bernardino@usp.br> References: <20190322232237.13293-1-matheus.bernardino@usp.br> <20190330224907.3277-1-matheus.bernardino@usp.br> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Add the possibility of giving flags to dir_iterator_begin to initialize a dir-iterator with special options. Currently possible flags are DIR_ITERATOR_PEDANTIC, which makes dir_iterator_advance abort immediately in the case of an error while trying to fetch next entry; and DIR_ITERATOR_FOLLOW_SYMLINKS, which makes the iteration follow symlinks to directories and include its contents in the iteration. These new flags will be used in a subsequent patch. Also adjust refs/files-backend.c to the new dir_iterator_begin signature. Signed-off-by: Matheus Tavares --- dir-iterator.c | 28 +++++++++++++++++++++++++--- dir-iterator.h | 39 +++++++++++++++++++++++++++++++++------ refs/files-backend.c | 2 +- 3 files changed, 59 insertions(+), 10 deletions(-) diff --git a/dir-iterator.c b/dir-iterator.c index f2dcd82fde..17aca8ea41 100644 --- a/dir-iterator.c +++ b/dir-iterator.c @@ -48,12 +48,16 @@ struct dir_iterator_int { * that will be included in this iteration. */ struct dir_iterator_level *levels; + + /* Combination of flags for this dir-iterator */ + unsigned flags; }; int dir_iterator_advance(struct dir_iterator *dir_iterator) { struct dir_iterator_int *iter = (struct dir_iterator_int *)dir_iterator; + int ret; while (1) { struct dir_iterator_level *level = @@ -71,6 +75,8 @@ int dir_iterator_advance(struct dir_iterator *dir_iterator) level->dir = opendir(iter->base.path.buf); if (!level->dir && errno != ENOENT) { + if (iter->flags & DIR_ITERATOR_PEDANTIC) + goto error_out; warning("error opening directory %s: %s", iter->base.path.buf, strerror(errno)); /* Popping the level is handled below */ @@ -122,6 +128,8 @@ int dir_iterator_advance(struct dir_iterator *dir_iterator) if (!de) { /* This level is exhausted; pop up a level. */ if (errno) { + if (iter->flags & DIR_ITERATOR_PEDANTIC) + goto error_out; warning("error reading directory %s: %s", iter->base.path.buf, strerror(errno)); } else if (closedir(level->dir)) @@ -138,11 +146,20 @@ int dir_iterator_advance(struct dir_iterator *dir_iterator) continue; strbuf_addstr(&iter->base.path, de->d_name); - if (lstat(iter->base.path.buf, &iter->base.st) < 0) { - if (errno != ENOENT) + + if (iter->flags & DIR_ITERATOR_FOLLOW_SYMLINKS) + ret = stat(iter->base.path.buf, &iter->base.st); + else + ret = lstat(iter->base.path.buf, &iter->base.st); + + if (ret < 0) { + if (errno != ENOENT) { + if (iter->flags & DIR_ITERATOR_PEDANTIC) + goto error_out; warning("error reading path '%s': %s", iter->base.path.buf, strerror(errno)); + } continue; } @@ -159,6 +176,10 @@ int dir_iterator_advance(struct dir_iterator *dir_iterator) return ITER_OK; } } + +error_out: + dir_iterator_abort(dir_iterator); + return ITER_ERROR; } int dir_iterator_abort(struct dir_iterator *dir_iterator) @@ -182,7 +203,7 @@ int dir_iterator_abort(struct dir_iterator *dir_iterator) return ITER_DONE; } -struct dir_iterator *dir_iterator_begin(const char *path) +struct dir_iterator *dir_iterator_begin(const char *path, unsigned flags) { struct dir_iterator_int *iter = xcalloc(1, sizeof(*iter)); struct dir_iterator *dir_iterator = &iter->base; @@ -195,6 +216,7 @@ struct dir_iterator *dir_iterator_begin(const char *path) ALLOC_GROW(iter->levels, 10, iter->levels_alloc); + iter->flags = flags; iter->levels_nr = 1; iter->levels[0].initialized = 0; diff --git a/dir-iterator.h b/dir-iterator.h index 970793d07a..93646c3bea 100644 --- a/dir-iterator.h +++ b/dir-iterator.h @@ -19,7 +19,7 @@ * A typical iteration looks like this: * * int ok; - * struct iterator *iter = dir_iterator_begin(path); + * struct iterator *iter = dir_iterator_begin(path, 0); * * while ((ok = dir_iterator_advance(iter)) == ITER_OK) { * if (want_to_stop_iteration()) { @@ -40,6 +40,20 @@ * dir_iterator_advance() again. */ +/* + * Flags for dir_iterator_begin: + * + * - DIR_ITERATOR_PEDANTIC: override dir-iterator's default behavior + * in case of an error while trying to fetch the next entry, which is + * to emit a warning and keep going. With this flag, resouces are + * freed and ITER_ERROR is return immediately. + * + * - DIR_ITERATOR_FOLLOW_SYMLINKS: make dir-iterator follow symlinks to + * directories, i.e., iterate over linked directories' contents. + */ +#define DIR_ITERATOR_PEDANTIC (1 << 0) +#define DIR_ITERATOR_FOLLOW_SYMLINKS (1 << 1) + struct dir_iterator { /* The current path: */ struct strbuf path; @@ -54,20 +68,28 @@ struct dir_iterator { /* The current basename: */ const char *basename; - /* The result of calling lstat() on path: */ + /* + * The result of calling lstat() on path or stat(), if the + * DIR_ITERATOR_FOLLOW_SYMLINKS flag was set at + * dir_iterator's initialization. + */ struct stat st; }; /* - * Start a directory iteration over path. Return a dir_iterator that - * holds the internal state of the iteration. + * Start a directory iteration over path with the combination of + * options specified by flags. Return a dir_iterator that holds the + * internal state of the iteration. * * The iteration includes all paths under path, not including path * itself and not including "." or ".." entries. * - * path is the starting directory. An internal copy will be made. + * Parameters are: + * - path is the starting directory. An internal copy will be made. + * - flags is a combination of the possible flags to initialize a + * dir-iterator or 0 for default behaviour. */ -struct dir_iterator *dir_iterator_begin(const char *path); +struct dir_iterator *dir_iterator_begin(const char *path, unsigned flags); /* * Advance the iterator to the first or next item and return ITER_OK. @@ -76,6 +98,11 @@ struct dir_iterator *dir_iterator_begin(const char *path); * dir_iterator and associated resources and return ITER_ERROR. It is * a bug to use iterator or call this function again after it has * returned ITER_DONE or ITER_ERROR. + * + * Note that whether dir-iterator will return ITER_ERROR when failing + * to fetch the next entry or just emit a warning and try to fetch the + * next is defined by the 'pedantic' option at dir-iterator's + * initialization. */ int dir_iterator_advance(struct dir_iterator *iterator); diff --git a/refs/files-backend.c b/refs/files-backend.c index ef053f716c..2ce9783097 100644 --- a/refs/files-backend.c +++ b/refs/files-backend.c @@ -2143,7 +2143,7 @@ static struct ref_iterator *reflog_iterator_begin(struct ref_store *ref_store, base_ref_iterator_init(ref_iterator, &files_reflog_iterator_vtable, 0); strbuf_addf(&sb, "%s/logs", gitdir); - iter->dir_iterator = dir_iterator_begin(sb.buf); + iter->dir_iterator = dir_iterator_begin(sb.buf, 0); iter->ref_store = ref_store; strbuf_release(&sb); From patchwork Sat Mar 30 22:49:04 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Matheus Tavares X-Patchwork-Id: 10878617 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 81EDF1708 for ; Sat, 30 Mar 2019 22:49:35 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6A3B828692 for ; Sat, 30 Mar 2019 22:49:35 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5AB1D28790; Sat, 30 Mar 2019 22:49:35 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E2B1D28692 for ; Sat, 30 Mar 2019 22:49:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731029AbfC3Wtb (ORCPT ); Sat, 30 Mar 2019 18:49:31 -0400 Received: from mail-qt1-f196.google.com ([209.85.160.196]:35655 "EHLO mail-qt1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730666AbfC3Wtb (ORCPT ); Sat, 30 Mar 2019 18:49:31 -0400 Received: by mail-qt1-f196.google.com with SMTP id h39so6776594qte.2 for ; Sat, 30 Mar 2019 15:49:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=usp-br.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=2Uafob/Eu9R+Z8DOetI66hIuGTZQtXfWUgDBF3o4DcM=; b=ziqm0eJV15Mkzbh14TYwJUCZAqcQXnwZ8kxK9WBd7BP6+nuBv7IyG6hlvkehjJRe8w v/xJ4D3De6BOGo3++HeaUcJwlDydeRjEC5Jo6wUK/mN0b295mZ7GnJlhmqUWw0BOjaHu L2Alj+HwG5E/TGG6wwvWkoDhe9ygmhBGUo6/ysH8M494ieIa4AD0ZajZV9jOG5ykyGg4 /ZYZZIvaCIoajc3hYvQ7l3P+T0SxRI4gRU2pAMTmAl2o6hhk7rBICHakR2YPmM156YD4 zZKcxMmtSRBmSqkhl3aQ1B2MnGH5XNvBVY/ddwCDFD2yjBJ0J7AJ9aU1as+pO34odCZN AHkg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=2Uafob/Eu9R+Z8DOetI66hIuGTZQtXfWUgDBF3o4DcM=; b=kMWluy3v+wcm5dJHOFyUpsaVY/YKiKbPxLEjYZVrTU4TVGxBsQJjJmTbJCg5xyQnyv MY3bncWKo8y9vYQ6Ffv6NPeCMHdM6YI6o9cNvR2GLUBX6xjukomeQIBOjAu/VWhdy4xu CBCZLS4iNoTl5i1QyWTRIZcTELjTTAQM9nMKhRf4bboEMJ0tDrS7GBMKjpeE3HcG/T+g iTU1Qmhulu7AZLnuW+8uxs55V6YqBv3QBsofSsn3MDQnLTE87y6Ozcq5AJ/nd1BuckEm 83JbBRQJ2Ctz5BF3P9izp3L32+ewmh0mG+Ffpuba2ZMH0Z6yGAbEuxcF8hIpOaYbe3hY DzwA== X-Gm-Message-State: APjAAAUlynEVt7ncrvvYh3DnRJwqnBTVEWWxm1+OJBdj1D9Qn6q/KuLS DXk2BOqCzL80jcWhTBxLdylKsw== X-Google-Smtp-Source: APXvYqyF7X8jsyAT+9ZFuwI2G+h2BgRPmiGz75ep0+zYn0UQ5xQu8MPHM/+WZmLQpYyvuGeOHoeH5w== X-Received: by 2002:ac8:2949:: with SMTP id z9mr47051466qtz.302.1553986170383; Sat, 30 Mar 2019 15:49:30 -0700 (PDT) Received: from mango.spo.virtua.com.br ([2804:14c:81:942d::4]) by smtp.gmail.com with ESMTPSA id x191sm3139943qka.78.2019.03.30.15.49.27 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 30 Mar 2019 15:49:29 -0700 (PDT) From: Matheus Tavares To: Junio C Hamano Cc: git@vger.kernel.org, Thomas Gummerer , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= , Christian Couder , =?utf-8?b?Tmd1eeG7hW4gVGg=?= =?utf-8?b?w6FpIE5n4buNYyBEdXk=?= , =?utf-8?q?SZEDER_G?= =?utf-8?q?=C3=A1bor?= , kernel-usp@googlegroups.com Subject: [GSoC][PATCH v5 4/7] clone: copy hidden paths at local clone Date: Sat, 30 Mar 2019 19:49:04 -0300 Message-Id: <20190330224907.3277-5-matheus.bernardino@usp.br> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190330224907.3277-1-matheus.bernardino@usp.br> References: <20190322232237.13293-1-matheus.bernardino@usp.br> <20190330224907.3277-1-matheus.bernardino@usp.br> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Make the copy_or_link_directory function no longer skip hidden directories. This function, used to copy .git/objects, currently skips all hidden directories but not hidden files, which is an odd behaviour. The reason for that could be unintentional: probably the intention was to skip '.' and '..' only but it ended up accidentally skipping all directories starting with '.'. Besides being more natural, the new behaviour is more permissive to the user. Also adjust tests to reflect this behaviour change. Signed-off-by: Matheus Tavares Signed-off-by: Ævar Arnfjörð Bjarmason Co-authored-by: Ævar Arnfjörð Bjarmason --- builtin/clone.c | 2 +- t/t5604-clone-reference.sh | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/builtin/clone.c b/builtin/clone.c index f975b509f1..81e1a39c61 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -428,7 +428,7 @@ static void copy_or_link_directory(struct strbuf *src, struct strbuf *dest, continue; } if (S_ISDIR(buf.st_mode)) { - if (de->d_name[0] != '.') + if (!is_dot_or_dotdot(de->d_name)) copy_or_link_directory(src, dest, src_repo, src_baselen); continue; diff --git a/t/t5604-clone-reference.sh b/t/t5604-clone-reference.sh index 0800c3853f..c3998f2f9e 100755 --- a/t/t5604-clone-reference.sh +++ b/t/t5604-clone-reference.sh @@ -247,16 +247,25 @@ test_expect_success 'clone a repo with garbage in objects/*' ' done && find S-* -name "*some*" | sort >actual && cat >expected <<-EOF && + S--dissociate/.git/objects/.some-hidden-dir + S--dissociate/.git/objects/.some-hidden-dir/.some-dot-file + S--dissociate/.git/objects/.some-hidden-dir/some-file S--dissociate/.git/objects/.some-hidden-file S--dissociate/.git/objects/some-dir S--dissociate/.git/objects/some-dir/.some-dot-file S--dissociate/.git/objects/some-dir/some-file S--dissociate/.git/objects/some-file + S--local/.git/objects/.some-hidden-dir + S--local/.git/objects/.some-hidden-dir/.some-dot-file + S--local/.git/objects/.some-hidden-dir/some-file S--local/.git/objects/.some-hidden-file S--local/.git/objects/some-dir S--local/.git/objects/some-dir/.some-dot-file S--local/.git/objects/some-dir/some-file S--local/.git/objects/some-file + S--no-hardlinks/.git/objects/.some-hidden-dir + S--no-hardlinks/.git/objects/.some-hidden-dir/.some-dot-file + S--no-hardlinks/.git/objects/.some-hidden-dir/some-file S--no-hardlinks/.git/objects/.some-hidden-file S--no-hardlinks/.git/objects/some-dir S--no-hardlinks/.git/objects/some-dir/.some-dot-file From patchwork Sat Mar 30 22:49:05 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matheus Tavares X-Patchwork-Id: 10878621 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D086815AC for ; Sat, 30 Mar 2019 22:49:37 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id BCFEE28683 for ; Sat, 30 Mar 2019 22:49:37 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B1569286AD; Sat, 30 Mar 2019 22:49:37 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 589C128683 for ; Sat, 30 Mar 2019 22:49:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731034AbfC3Wtf (ORCPT ); Sat, 30 Mar 2019 18:49:35 -0400 Received: from mail-qt1-f195.google.com ([209.85.160.195]:42376 "EHLO mail-qt1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730666AbfC3Wtf (ORCPT ); Sat, 30 Mar 2019 18:49:35 -0400 Received: by mail-qt1-f195.google.com with SMTP id p20so6492662qtc.9 for ; Sat, 30 Mar 2019 15:49:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=usp-br.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=9Mi3ViTH8eD299yUFNsXA0ViLNKlpNXJVcqXyGd8Mf8=; b=T3AJMWChXU34PyJHNibacgbMxKPovZlAASU2g5dtr0SxeoCGnMsEQXe1GL0NC+orHd 4InKlm6RACAJY2g1lt0dMjuVBte7M0gNJf09xvvahqKDzT6HtB1ovgXwHmnTh6IALk3+ L0jBmfKq9ob/sEdui2xBA0E5vlqEZY+LEJ3FEADGomWPgc0VIgHfnBs8Ix6h7ru9WwlS 8+dhgoAO8MCeOPam/NlZwNLOsCqPwwiEfshBwn6o4atqUvEnf4UZuA4Yccgi5/HGB08k XnehYxS7QXJgQe7hD35XQzmMp9/F0e5Em/0cRTxyFC8Luv7p5Hmaby27ns1ySpbVeceQ TrTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=9Mi3ViTH8eD299yUFNsXA0ViLNKlpNXJVcqXyGd8Mf8=; b=t4005Igg+wQpHy4v7COPhJH2wXTdX2tZ0r/ZgPOLxG4ihL+Y7nyVX0vKUUFATel9g9 Srn0tksymfthhdyVmbORjN5dDTnraUS9bZpfsLvXN/t+ukmDeIl8MilWOg/eQjCyFjsF nTUqome5PsX/zo8dp4CuDGxOhhZdXv7n/qpi23Tof3kg6tYAoMvsnGaHfjMFnSvUZLP4 irMOS4ozhV7LpmRN3Mbc3EuEQrS6rmkbQ+PjASRk9l4QVuYfCLbeDQdoO8Q5fxQoPZJV jjJ+2JJjteXHgvqLy4Xb8DDXve7fy5qMvRj2KZzxq9OkMBu7U9gePqjCNRH9i+jsCbSd 66EA== X-Gm-Message-State: APjAAAXjui2UUEqDLjCYkq+zvEBM4juS6v1TqL6JQModYiEEXDdbJkrF Hblm9fmgG4/8AmT0moSc0qRG2g== X-Google-Smtp-Source: APXvYqzo3iCoGselz7K1UDR3HHHs/BCYufzRCcpcSRUJt1kb9LdW9DfskzlNLbfu326/VZdL9X1K0g== X-Received: by 2002:a0c:81a9:: with SMTP id 38mr45643782qvd.208.1553986173679; Sat, 30 Mar 2019 15:49:33 -0700 (PDT) Received: from mango.spo.virtua.com.br ([2804:14c:81:942d::4]) by smtp.gmail.com with ESMTPSA id x191sm3139943qka.78.2019.03.30.15.49.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 30 Mar 2019 15:49:33 -0700 (PDT) From: Matheus Tavares To: Junio C Hamano Cc: git@vger.kernel.org, Thomas Gummerer , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= , Christian Couder , =?utf-8?b?Tmd1eeG7hW4gVGg=?= =?utf-8?b?w6FpIE5n4buNYyBEdXk=?= , =?utf-8?q?SZEDER_G?= =?utf-8?q?=C3=A1bor?= , kernel-usp@googlegroups.com Subject: [GSoC][PATCH v5 5/7] clone: extract function from copy_or_link_directory Date: Sat, 30 Mar 2019 19:49:05 -0300 Message-Id: <20190330224907.3277-6-matheus.bernardino@usp.br> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190330224907.3277-1-matheus.bernardino@usp.br> References: <20190322232237.13293-1-matheus.bernardino@usp.br> <20190330224907.3277-1-matheus.bernardino@usp.br> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Extract dir creation code snippet from copy_or_link_directory to its own function named mkdir_if_missing. This change will help to remove copy_or_link_directory's explicit recursion, which will be done in a following patch. Also makes the code more readable. Signed-off-by: Matheus Tavares --- builtin/clone.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/builtin/clone.c b/builtin/clone.c index 81e1a39c61..f348eb02d4 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -392,6 +392,21 @@ static void copy_alternates(struct strbuf *src, struct strbuf *dst, fclose(in); } +static void mkdir_if_missing(const char *pathname, mode_t mode) +{ + struct stat st; + + if (!mkdir(pathname, mode)) + return; + + if (errno != EEXIST) + die_errno(_("failed to create directory '%s'"), pathname); + else if (stat(pathname, &st)) + die_errno(_("failed to stat '%s'"), pathname); + else if (!S_ISDIR(st.st_mode)) + die(_("%s exists and is not a directory"), pathname); +} + static void copy_or_link_directory(struct strbuf *src, struct strbuf *dest, const char *src_repo, int src_baselen) { @@ -404,14 +419,7 @@ static void copy_or_link_directory(struct strbuf *src, struct strbuf *dest, if (!dir) die_errno(_("failed to open '%s'"), src->buf); - if (mkdir(dest->buf, 0777)) { - if (errno != EEXIST) - die_errno(_("failed to create directory '%s'"), dest->buf); - else if (stat(dest->buf, &buf)) - die_errno(_("failed to stat '%s'"), dest->buf); - else if (!S_ISDIR(buf.st_mode)) - die(_("%s exists and is not a directory"), dest->buf); - } + mkdir_if_missing(dest->buf, 0777); strbuf_addch(src, '/'); src_len = src->len; From patchwork Sat Mar 30 22:49:06 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matheus Tavares X-Patchwork-Id: 10878623 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id A2C3313B5 for ; Sat, 30 Mar 2019 22:49:40 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8EDD728683 for ; Sat, 30 Mar 2019 22:49:40 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 832E4286AD; Sat, 30 Mar 2019 22:49:40 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0D4BF28683 for ; Sat, 30 Mar 2019 22:49:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731038AbfC3Wti (ORCPT ); Sat, 30 Mar 2019 18:49:38 -0400 Received: from mail-qt1-f193.google.com ([209.85.160.193]:41292 "EHLO mail-qt1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730666AbfC3Wti (ORCPT ); Sat, 30 Mar 2019 18:49:38 -0400 Received: by mail-qt1-f193.google.com with SMTP id w30so6491905qta.8 for ; Sat, 30 Mar 2019 15:49:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=usp-br.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=YUCTh4hKuaIaCiI+7pw9czoTv/o3s2VHTp+oCDfcbu4=; b=K5aWVreAl+7xcdoMVEm/5x9Rpn6eZuit60YIrM5gSAV/P5vT9kfkaUAq0J7s3zIN+g 0HJaRMs7URzj2Xguxmg0TxriCP1Ij68796nxAJfbyANeHHXbuYFx3OQMc7ZU7wepsWSg /9YCcPHRSVqavtdoQ6t3WbQNyOj5aZMFs8eKEKHXFnFq43oY0voronHhSEfKWJoaRjFM Z85+rchXDdwTOP5thR+6xr8yTJB+piV7fVw2YbO8CXotJOseLgRlD5sfKMWwGHbvhFI/ TPB/+4XwmV82oZ14CK9WPp3rBwzq44eAbXPeyteHKa5QQfdsOKHGyirHjJNaNKrNIx/r W/Dw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=YUCTh4hKuaIaCiI+7pw9czoTv/o3s2VHTp+oCDfcbu4=; b=rauDUoLJ8ZUfTqmnwmYh7v1ZFnj0u00IVqaS6VZwbYTVNA1vq1BEErWdqkMUuk6tt9 9CrvXoSD5DiwHq1pOUAhVHWP4xQ17FEsxlDdneKL3uaLrilY8YXP3I/1rJ2ErobnGz+X 4oCx8jxuF1+53/nsD60FAd5ETxqxHVZYqVhO2TLj7SefWJgdPxRhnmmKDIWXPsPR3dNz wVrvl2Gk6DmlnwTjNeloK3xzuiYuhpXr1tuR+Dh9prnGuZQWL7MrZCqS1bregxZV1obh flHsOF3+1ctb6AaQVs11LZlpcUcmPG8bmZIqrp6AVAZLzykuapFaCe7fUfiGVke3gxj8 UHIg== X-Gm-Message-State: APjAAAVzK8wMl/woLqexN3lcZ3rvPaejE8WZbeY5Ogs6wp5ogAdU1ape +BbaJg7vAUIx/w8++aLNZ9UDcA== X-Google-Smtp-Source: APXvYqzurJqoDIQalye5R6Z7zfYF0GtWDTDbXdoBsCqLvL7ewUB0Afr5DjaD/k4H9mfF4ncE+VGpvg== X-Received: by 2002:ac8:6b98:: with SMTP id z24mr23495601qts.248.1553986176869; Sat, 30 Mar 2019 15:49:36 -0700 (PDT) Received: from mango.spo.virtua.com.br ([2804:14c:81:942d::4]) by smtp.gmail.com with ESMTPSA id x191sm3139943qka.78.2019.03.30.15.49.34 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 30 Mar 2019 15:49:36 -0700 (PDT) From: Matheus Tavares To: Junio C Hamano Cc: git@vger.kernel.org, Thomas Gummerer , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= , Christian Couder , =?utf-8?b?Tmd1eeG7hW4gVGg=?= =?utf-8?b?w6FpIE5n4buNYyBEdXk=?= , =?utf-8?q?SZEDER_G?= =?utf-8?q?=C3=A1bor?= , kernel-usp@googlegroups.com Subject: [GSoC][PATCH v5 6/7] clone: use dir-iterator to avoid explicit dir traversal Date: Sat, 30 Mar 2019 19:49:06 -0300 Message-Id: <20190330224907.3277-7-matheus.bernardino@usp.br> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190330224907.3277-1-matheus.bernardino@usp.br> References: <20190322232237.13293-1-matheus.bernardino@usp.br> <20190330224907.3277-1-matheus.bernardino@usp.br> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Replace usage of opendir/readdir/closedir API to traverse directories recursively, at copy_or_link_directory function, by the dir-iterator API. This simplifies the code and avoids recursive calls to copy_or_link_directory. This process also makes copy_or_link_directory call die() in case of an error on readdir or stat, inside dir_iterator_advance. Previously it would just print a warning for errors on stat and ignore errors on readdir, which isn't nice because a local git clone could succeed even though the .git/objects copy didn't fully succeed. Signed-off-by: Matheus Tavares --- builtin/clone.c | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/builtin/clone.c b/builtin/clone.c index f348eb02d4..ebe8d83334 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -23,6 +23,8 @@ #include "transport.h" #include "strbuf.h" #include "dir.h" +#include "dir-iterator.h" +#include "iterator.h" #include "sigchain.h" #include "branch.h" #include "remote.h" @@ -408,42 +410,36 @@ static void mkdir_if_missing(const char *pathname, mode_t mode) } static void copy_or_link_directory(struct strbuf *src, struct strbuf *dest, - const char *src_repo, int src_baselen) + const char *src_repo) { - struct dirent *de; - struct stat buf; int src_len, dest_len; - DIR *dir; - - dir = opendir(src->buf); - if (!dir) - die_errno(_("failed to open '%s'"), src->buf); + struct dir_iterator *iter; + int iter_status; + unsigned flags; mkdir_if_missing(dest->buf, 0777); + flags = DIR_ITERATOR_PEDANTIC | DIR_ITERATOR_FOLLOW_SYMLINKS; + iter = dir_iterator_begin(src->buf, flags); + strbuf_addch(src, '/'); src_len = src->len; strbuf_addch(dest, '/'); dest_len = dest->len; - while ((de = readdir(dir)) != NULL) { + while ((iter_status = dir_iterator_advance(iter)) == ITER_OK) { strbuf_setlen(src, src_len); - strbuf_addstr(src, de->d_name); + strbuf_addstr(src, iter->relative_path); strbuf_setlen(dest, dest_len); - strbuf_addstr(dest, de->d_name); - if (stat(src->buf, &buf)) { - warning (_("failed to stat %s\n"), src->buf); - continue; - } - if (S_ISDIR(buf.st_mode)) { - if (!is_dot_or_dotdot(de->d_name)) - copy_or_link_directory(src, dest, - src_repo, src_baselen); + strbuf_addstr(dest, iter->relative_path); + + if (S_ISDIR(iter->st.st_mode)) { + mkdir_if_missing(dest->buf, 0777); continue; } /* Files that cannot be copied bit-for-bit... */ - if (!strcmp(src->buf + src_baselen, "/info/alternates")) { + if (!strcmp(iter->relative_path, "info/alternates")) { copy_alternates(src, dest, src_repo); continue; } @@ -463,7 +459,11 @@ static void copy_or_link_directory(struct strbuf *src, struct strbuf *dest, if (copy_file_with_time(dest->buf, src->buf, 0666)) die_errno(_("failed to copy file to '%s'"), dest->buf); } - closedir(dir); + + if (iter_status != ITER_DONE) { + strbuf_setlen(src, src_len); + die(_("failed to iterate over '%s'"), src->buf); + } } static void clone_local(const char *src_repo, const char *dest_repo) @@ -481,7 +481,7 @@ static void clone_local(const char *src_repo, const char *dest_repo) get_common_dir(&dest, dest_repo); strbuf_addstr(&src, "/objects"); strbuf_addstr(&dest, "/objects"); - copy_or_link_directory(&src, &dest, src_repo, src.len); + copy_or_link_directory(&src, &dest, src_repo); strbuf_release(&src); strbuf_release(&dest); } From patchwork Sat Mar 30 22:49:07 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Matheus Tavares X-Patchwork-Id: 10878625 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id DAE661708 for ; Sat, 30 Mar 2019 22:49:42 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C6BF728683 for ; Sat, 30 Mar 2019 22:49:42 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id BB5CE286AD; Sat, 30 Mar 2019 22:49:42 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6F60B28683 for ; Sat, 30 Mar 2019 22:49:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731040AbfC3Wtk (ORCPT ); Sat, 30 Mar 2019 18:49:40 -0400 Received: from mail-qk1-f193.google.com ([209.85.222.193]:46052 "EHLO mail-qk1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730666AbfC3Wtk (ORCPT ); Sat, 30 Mar 2019 18:49:40 -0400 Received: by mail-qk1-f193.google.com with SMTP id z76so3493482qkb.12 for ; Sat, 30 Mar 2019 15:49:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=usp-br.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=sTqzu4bkX97p2Gg0BAbqbU1HqIJ2T97IuvkxCs0Dmio=; b=g4x7a5t/Dv9fJhAmdSG1/UodWNhpnSxUAqkellaaLGUbFQfXTLc1Bc4cXdVYCT4Qb1 tF+XRZMGR2vte/9J8+CMT9773/BOHuA04rNdCIrDYL8+HgjPz5qT/TihoFSqeqhbpgrY 2lWRWG+nxI0IlWgGQaU8KNVm4O2M/EUy0Y0hZM2W6knsm0jA7guTueeIKG4pDLpFXYRY wIHFkwWgAwVF742lmTI4N+1tOASQp7hZ5BpMIxSoG3SHxNN7xZiv30dcpHD47pH8BWi+ 3iAjUmHz2mjXj9xaAhK8BVvc+UHUgNb/j8/Gd4EKLYUTAjl9Yc+XPIwdMWCDXpk4Tbim tKcQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=sTqzu4bkX97p2Gg0BAbqbU1HqIJ2T97IuvkxCs0Dmio=; b=RzhgL45VxowAldmhKm144imgouSQf/mqGR2inrtL45Nx2mPzrwN9e9hcQDNiD07njJ JDPivP1CbiKl8+hhXEF0ZLdnk2bkW8JLF2reBAmfHjtRF18fL4itMveleLiZjmmdJjis Mm4zlSJoQrz4UmrMwWvwPbOA8fy39srjcQouVpxErzgawaNq/43MBDyL0F3mKDYZkgth GaGb+Y7qW8p4ICiJeyW0J9prVs43H5IJIoGOZYRMzQlS/WKBmt8bujNLN7QpAPuDvomw LeX4b+jBQKKd/4Tdvf0TyI9uoDjkIuwodXfnUAgzn0BUUoiiZ/eWGUc4Jj6XmMICW8Bu a3hg== X-Gm-Message-State: APjAAAWBCMHAWnhHaXV7OUU0rzK83wLygvZMVauXaLTOvQSnDa+ux+wu Fb3tlfHDGvP0y7LurwEjezMEUw== X-Google-Smtp-Source: APXvYqy9JVjoy/Ywt+waxf4o3OI15PuQd7CfMSDgTGWhIC/ITLPV9fLXAC9flXk5SeWowiuRNgHgYA== X-Received: by 2002:a37:4c8e:: with SMTP id z136mr3383807qka.149.1553986179752; Sat, 30 Mar 2019 15:49:39 -0700 (PDT) Received: from mango.spo.virtua.com.br ([2804:14c:81:942d::4]) by smtp.gmail.com with ESMTPSA id x191sm3139943qka.78.2019.03.30.15.49.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 30 Mar 2019 15:49:39 -0700 (PDT) From: Matheus Tavares To: Junio C Hamano Cc: git@vger.kernel.org, Thomas Gummerer , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= , Christian Couder , =?utf-8?b?Tmd1eeG7hW4gVGg=?= =?utf-8?b?w6FpIE5n4buNYyBEdXk=?= , =?utf-8?q?SZEDER_G?= =?utf-8?q?=C3=A1bor?= , kernel-usp@googlegroups.com Subject: [GSoC][PATCH v5 7/7] clone: replace strcmp by fspathcmp Date: Sat, 30 Mar 2019 19:49:07 -0300 Message-Id: <20190330224907.3277-8-matheus.bernardino@usp.br> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190330224907.3277-1-matheus.bernardino@usp.br> References: <20190322232237.13293-1-matheus.bernardino@usp.br> <20190330224907.3277-1-matheus.bernardino@usp.br> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Replace the use of strcmp by fspathcmp at copy_or_link_directory, which is more permissive/friendly to case-insensitive file systems. Signed-off-by: Matheus Tavares Suggested-by: Nguyễn Thái Ngọc Duy --- builtin/clone.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/builtin/clone.c b/builtin/clone.c index ebe8d83334..bf56a01638 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -439,7 +439,7 @@ static void copy_or_link_directory(struct strbuf *src, struct strbuf *dest, } /* Files that cannot be copied bit-for-bit... */ - if (!strcmp(iter->relative_path, "info/alternates")) { + if (!fspathcmp(iter->relative_path, "info/alternates")) { copy_alternates(src, dest, src_repo); continue; }