From patchwork Mon Feb 24 14:27:39 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Couder X-Patchwork-Id: 13988261 Received: from mail-wr1-f51.google.com (mail-wr1-f51.google.com [209.85.221.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1E4941E871 for ; Mon, 24 Feb 2025 14:28:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740407288; cv=none; b=ZlLFqGezlRlJq86qb8j8X89Y2v7EE2VV4L9WWxMh/0OXL7hcYnJJJW1UokdFNRjg64uyxJN/lBqtinU3yVu/H5ZF+tJbeSgWn1VAohLYnHj1BufCEo5UZRmJvSNUL/GtLzHpdHpW/Pmo6dL51mL2IXBs6SZ4remVbWiEJhj4skQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740407288; c=relaxed/simple; bh=uTL0lV6X36dMh2lBn1rywQSUjKe0jQBlSLvs8zcHxRg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=t3kQ6cqoesmhxULGCktkblrzIpPg3+49khDQ+lzOlxx0nJVZyRl2/SgX4r1A4ySRuRKhOX6fDr/OWF8Lx9PMBW1MFBJDQgZ++xO/Pdc1MA6tm0MMfcJrMv32ZXMVT9sPkMUg8u7qUJB/R61HM2W8hFS7Z7A6Q0b4/aYtaoDitb8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=NjYqnl0c; arc=none smtp.client-ip=209.85.221.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="NjYqnl0c" Received: by mail-wr1-f51.google.com with SMTP id ffacd0b85a97d-38f265c6cb0so2167727f8f.2 for ; Mon, 24 Feb 2025 06:28:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740407284; x=1741012084; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=7wzwlxq3x8IVBvvI4EmbrnmTOMawTyIzojBlHL/pFT8=; b=NjYqnl0cKLmdCEHzRmuaksj8ijWW9nnc13Wsi7kjaCglU+1qXqJ9Rhj96j9cLrTquQ VWYRlAA56Lv4YAoD/lUqJwECb8U/SuQXc1KsV+vsy6Bt8zq/cFs4+3Min3NzsQTGZTwd /ZN6UY/oeUtB6neJowhSIS3/0I9Y98c/qTGfD1QDM8Y1lfyVbYOwZww3Jrl1I7eDL6rP Ei042nLWbG2MfpW2r5H1+czdVk2HyheE/tzdwXT2XyTViuQG7ISSGXgZjligVVDOi8hn Pi54dpwh+4mcRTZS/Q5GPIsEx/Mfrsnb58E3N9sIlh1kfJhjaR0rE73J8OoU8STr211N 5bpg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740407284; x=1741012084; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=7wzwlxq3x8IVBvvI4EmbrnmTOMawTyIzojBlHL/pFT8=; b=q6g6AZuE7W451p5kW0Slnr14HC+DNtUTMLXnUuaUV6Q8EctdTTHwfKJpBnrt3sai9x hwf4isARqkaWGvMdaWGOs1CL4r+byXi3/yTlmdNjfJYgcI0L6sqbZ1u1AenU3GxHmEMr dK5cLXowHnFStCtiiuqOFale2PxH8dfckRtW5cXEICzLWr6uymcN+IkWXArYSpFI5JTl rOXOmhbR30Ok1A+1fNnADBGKOfxomZWkkRWij43R1svNAoNNFoFKs0Tp7bTNswF6V6fq cQYFo+EHJwd08haZlFljLFPsni48ljStN8zeoTjVGZUZZGYHdrAdtMSLAF5ZvxyzzQFW B6wQ== X-Gm-Message-State: AOJu0YwhocCK2lQKMoxhxoV0497olsXbLUp/I1bCNTAwq/sXRYsx0rXA IyHi+B/Z/sedUaGJADLfkkALNdhstDwH3A2s/AkAZIJVC7tV7AMRDtAYVQ== X-Gm-Gg: ASbGncv5O15k39OFF6ZY+JAfRuCSms1KXl30Mx6fCI+eDqxy/P4j6eReIbhdUBjBcLU bvPkCLtoBvAM2UP5UZmuGIaMNv5fvScmHoKxXUdrEz/zN+ujwsHFrEl4YxgatMNH0/uJ2gKDEIY 8CbRFp/lUouYJG5WTtSvWxDvLfrz4xHcZw2qlZO7mzkQu0UIwBe7XCp7aSbRTqiL919ygjLLVx2 mLskZjGOHf7xYjRZoWWsQ7s7PLhVdMpKCcBUTLiVmQHeLUt3xSXv/dhe+uuqSbe9m6r+k70PyKr OtMzNfNS/B75PQ5KXMewerppjRsrL0QX0dgiCHTN4bjcSyOjw6rJX6Bht0dA X-Google-Smtp-Source: AGHT+IHL0yHd1JcO1s/gKhbqzABpm1dBgv1XRcXrAGpNc8NOYsEg46m7EyryCs5TLMnwAkLMcOi1Vw== X-Received: by 2002:a05:6000:1fa3:b0:38d:d603:ff46 with SMTP id ffacd0b85a97d-38f7d1ffbfemr7789015f8f.14.1740407284424; Mon, 24 Feb 2025 06:28:04 -0800 (PST) Received: from christian-Precision-5550.lan ([2001:861:2420:9770:29b9:ffdd:d750:1ffc]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-38f259d58f3sm31713125f8f.73.2025.02.24.06.28.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Feb 2025 06:28:03 -0800 (PST) From: Christian Couder To: git@vger.kernel.org Cc: Junio C Hamano , Patrick Steinhardt , Luke Shumaker , Elijah Newren , Jeff King , Johannes Schindelin , Taylor Blau , "brian m . carlson" , Eric Sunshine , Luke Shumaker , Christian Couder Subject: [PATCH v5 1/6] git-fast-import.adoc: add missing LF in the BNF Date: Mon, 24 Feb 2025 15:27:39 +0100 Message-ID: <20250224142744.279643-2-christian.couder@gmail.com> X-Mailer: git-send-email 2.48.1.401.g48e0d4203c In-Reply-To: <20250224142744.279643-1-christian.couder@gmail.com> References: <20210430232537.1131641-1-lukeshu@lukeshu.com> <20250224142744.279643-1-christian.couder@gmail.com> Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Luke Shumaker Signed-off-by: Luke Shumaker Signed-off-by: Christian Couder --- Documentation/git-fast-import.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/git-fast-import.adoc b/Documentation/git-fast-import.adoc index 58a2eaa51a..8e0de618c0 100644 --- a/Documentation/git-fast-import.adoc +++ b/Documentation/git-fast-import.adoc @@ -437,7 +437,7 @@ change to the project. original-oid? ('author' (SP )? SP LT GT SP LF)? 'committer' (SP )? SP LT GT SP LF - ('encoding' SP )? + ('encoding' SP LF)? data ('from' SP LF)? ('merge' SP LF)* From patchwork Mon Feb 24 14:27:40 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Couder X-Patchwork-Id: 13988262 Received: from mail-wm1-f51.google.com (mail-wm1-f51.google.com [209.85.128.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0C9DF14D28C for ; Mon, 24 Feb 2025 14:28:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740407289; cv=none; b=MstSmAI46peOIMPN8b7tq+kC6eaQ0TaICFPeyUGEtj1DQAr0sNWCfdYcmeuAJI8kMO3vfGwhAwBjywkCNIk7ydFwpRvlWij3KpITCYYNbjEoyrJy397hDN4R6T+xC6ZAJHdRu0CB5EuM1qhawUwKs7CtYRJEzbxEgTqZglsezoY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740407289; c=relaxed/simple; bh=8K4xVmyqiCmjtMN3Z+7YoOgWz6omKVgjVsjAlK8VEh0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mQVPOarZzIVjg0KYe6EglEp2IdXF87cQJBqnJIF+WAj3iiKtBRjiOiqYGz6JQztuFJ3+8fMfR45ejy6c2BvD3mr2h2ZZc+GT5HPCKSQpBfR7q3AU7zaW4gk0+Fc42EHphoJiC/7V6lT0KZhl7GZ70F67DuHwO+1NXfEx+jU3Iqc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=M8+lNgjP; arc=none smtp.client-ip=209.85.128.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="M8+lNgjP" Received: by mail-wm1-f51.google.com with SMTP id 5b1f17b1804b1-439950a45daso27430915e9.2 for ; Mon, 24 Feb 2025 06:28:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740407285; x=1741012085; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=q8FDWFS7nSwCA7x2q+qcv7Hw2WPjWFzvNms+uWLJj+A=; b=M8+lNgjPTdz4P17q5S4WHYSUhNCwVQDQav139A6Kd/JcHQnHcn+Gbf3FxkUYjZPz2f YjwfQ9KtYyFSm1BnTMIc6cMPCeIVAq/c7Ufzy891HTG78rbPeLoj5mE3JaZCGM3FtwLX +ZuAF293woqlUi0KoRB0eC91annmx2DjehQbpzK2/Brma02AdJRvZ+o5aoKvzXVP9JIz Ta27YZg0cd6AfqFwHz12T0G8FNdA+NkFaj307xro+fmHdezW+yh97AKhzq+Avrj/FVln FNVr7mVeZfC/SE7f3U12eTyJXh9VZYcu3icUEZyl7aBGT8dGlUcUCqKrJtmUOHIrkaKy E9Yw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740407285; x=1741012085; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=q8FDWFS7nSwCA7x2q+qcv7Hw2WPjWFzvNms+uWLJj+A=; b=rMqBBTVhPDNTd6BmBhmQYM0wxvQ5GGuAr/YVuP3oo8LDV80T2Ff0j8pNc+Xf3tnB+2 RFmyk27HgTpdeKaAu2+TAsEH59a4H8ZXpaSQC11lju+Ya7kRW6PQgCVNpSieTGsy0/a5 ehX0iNM3T9H8I2GmatK4s00oO5WoZpQ+J3KQ44GN0lr6kEY+Ly3pLsADSRTbsxES0DNW aJAiyXFHm5jzdRdArc18tKler1PBHwUnMB6Jy1k3gg4X/N+ELtPM6SK75lY6oO3wMrNz wAfIm7EgU4SsXxwi3eCtMkgQvEVZ81e1Ed6raLmylvSefVEFQAoC5QC97lQIn8gPtG3Y uK1w== X-Gm-Message-State: AOJu0Yx/ILZ00zOjRUTQbCs1uVSjjCs6dKGoSXNbhNvCZfCKPsy+Mt+v RIMEHiGfLeMbmfyMpcxOmVAK0MMt6Elqw+5tdnR48i6G79J4x6+cIRL1xg== X-Gm-Gg: ASbGnct99CrFdG9XQTT6QWsIUENRqnYA7i5H8gelBnrS2OHVBm1bjDmzh0ROiGEuUte Sp+k1bYG3z597gQ3+d2O3ozTDWtWu46PWanwuG8j981VKEtkQzCL7RUkskS5JK3sqWA3g5sdrOz 904Qw+BTYp+aK22IO/eiKxewfR1tiCo4MIgw+oOFg1wQklIS8fDrHWQV9YdgyBIfYz0KysTdQIo 0F/HHgg7A60+Zg+oz9cBxXAfqQIrsCEoAGRqSwG/BYxNC2ejqM0K/5+sJUJuC4H9D93IdCGYzmi +76tR45eEdM9e2BUBobcuUe6bDJRjy5PwFsJyEmhMMdFgZrwubZHlJX6dN4g X-Google-Smtp-Source: AGHT+IHQpAfCZZwfcwxCOekJu9w6g7SliS8YTN/bpMi6PlxGq/WmISJjOI4Z0sQo7Y/8zAO/d+DZyw== X-Received: by 2002:a05:6000:186f:b0:38d:eb33:7f7e with SMTP id ffacd0b85a97d-38f6f097f55mr9840223f8f.36.1740407285322; Mon, 24 Feb 2025 06:28:05 -0800 (PST) Received: from christian-Precision-5550.lan ([2001:861:2420:9770:29b9:ffdd:d750:1ffc]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-38f259d58f3sm31713125f8f.73.2025.02.24.06.28.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Feb 2025 06:28:04 -0800 (PST) From: Christian Couder To: git@vger.kernel.org Cc: Junio C Hamano , Patrick Steinhardt , Luke Shumaker , Elijah Newren , Jeff King , Johannes Schindelin , Taylor Blau , "brian m . carlson" , Eric Sunshine , Christian Couder , Christian Couder Subject: [PATCH v5 2/6] fast-export: fix missing whitespace after switch Date: Mon, 24 Feb 2025 15:27:40 +0100 Message-ID: <20250224142744.279643-3-christian.couder@gmail.com> X-Mailer: git-send-email 2.48.1.401.g48e0d4203c In-Reply-To: <20250224142744.279643-1-christian.couder@gmail.com> References: <20210430232537.1131641-1-lukeshu@lukeshu.com> <20250224142744.279643-1-christian.couder@gmail.com> Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 "Documentation/CodingGuidelines" says that there should be whitespaces around operators like 'if', 'switch', 'for', etc. Let's fix this in "builtin/fast-export.c". Signed-off-by: Christian Couder --- builtin/fast-export.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/builtin/fast-export.c b/builtin/fast-export.c index a5c82eef1d..2bf787191a 100644 --- a/builtin/fast-export.c +++ b/builtin/fast-export.c @@ -694,7 +694,7 @@ static void handle_commit(struct commit *commit, struct rev_info *rev, if (anonymize) { reencoded = anonymize_commit_message(); } else if (encoding) { - switch(reencode_mode) { + switch (reencode_mode) { case REENCODE_YES: reencoded = reencode_string(message, "UTF-8", encoding); break; @@ -828,7 +828,7 @@ static void handle_tag(const char *name, struct tag *tag) const char *signature = strstr(message, "\n-----BEGIN PGP SIGNATURE-----\n"); if (signature) - switch(signed_tag_mode) { + switch (signed_tag_mode) { case SIGNED_TAG_ABORT: die("encountered signed tag %s; use " "--signed-tags= to handle it", @@ -853,7 +853,7 @@ static void handle_tag(const char *name, struct tag *tag) tagged = tag->tagged; tagged_mark = get_object_mark(tagged); if (!tagged_mark) { - switch(tag_of_filtered_mode) { + switch (tag_of_filtered_mode) { case TAG_FILTERING_ABORT: die("tag %s tags unexported object; use " "--tag-of-filtered-object= to handle it", @@ -965,7 +965,7 @@ static void get_tags_and_duplicates(struct rev_cmdline_info *info) continue; } - switch(commit->object.type) { + switch (commit->object.type) { case OBJ_COMMIT: break; case OBJ_BLOB: From patchwork Mon Feb 24 14:27:41 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Couder X-Patchwork-Id: 13988264 Received: from mail-wr1-f43.google.com (mail-wr1-f43.google.com [209.85.221.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 26863155744 for ; Mon, 24 Feb 2025 14:28:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740407292; cv=none; b=nMem4/wJH5Wln2nceU5tktALTKl91TCy0NznldDTbfmACeRv1YTgPrQZE4XbfuBN9YA/KjDFoPwg4spK3OBRDLc/oLKRHIQjf3P6jf2hihSMImkP0ZNzfTHBZoY1De9Pc7Ok6eKdvWBpVyHCpRwfDVEinrcyjzN+9DSqE6JF8uk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740407292; c=relaxed/simple; bh=ZwYf9WRMbuhixf6mmu2X4cIH9wFgzlEcIwR9UpzxuDY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cKL15GBUFEICRCfJP8SEA+1WGJLxMfxKsJE30Ls8Gt2oxPSX5ByLb3xnDFx6CPrshOJz+5heZWAL4pnY3nWdeLkqOCddi1oEYSb+ZrOXnYOUXGezWBKq3CI3yycFyKkPrTazojz++NjV87gaLFCy+9h41kr6ICTrsVvq6yuJ8Q4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=YVu027EP; arc=none smtp.client-ip=209.85.221.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="YVu027EP" Received: by mail-wr1-f43.google.com with SMTP id ffacd0b85a97d-38f406e9f80so4184615f8f.2 for ; Mon, 24 Feb 2025 06:28:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740407287; x=1741012087; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=3invKOWKedbzAlOHRv9VeZd4UNgPGa0WBPllbGXrrHw=; b=YVu027EPz+Nt0fyoBhcZLwV+QNT7PFz1J+Bi1cCyjyf15M31KXUnEhyRDBIHRr9lmX V2FoZ5ga9hepzrll4yKE1MwDig41a1xlI/4uCgIsPJ+sCdTHUSE/D6FOym7dmq2vWPb+ uav3cEwATgY53Fegs5E3/IcORLLKzYxQTt/3mOlX3g8bQ2kwmJig4KVUhHyT5LHtmCJb q6tw/7NBIh26cB2nHsko32IBj1qvFx4bIePjffQ1dgOSM/My+9m4lHyLgIiIhajPkg9I WiDQ6zETAfMsSWVLOBvo27r3Nul71UxdYv9iK7rTYHCsu+PELtQTTWxEQBgQXepX0RUH zZXw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740407287; x=1741012087; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=3invKOWKedbzAlOHRv9VeZd4UNgPGa0WBPllbGXrrHw=; b=EfMkN3mbAOCXPaVL30aNwTMiCUBXGAPGVG5mZqPLmaD6tINA+fxu8IZXc/XiKTAAd5 U3aoBMzN1akpg0WrJd356rt+wbaK9z6GP6xlkGMhBAC1mFOYIl5FrK+JNlbVq20aORdP YGaLMBA0PDhEpQfvgqjkC5EtBIEVb5u/XADZYyIbls+kElnuWdSyCW5FvBbFMKuHi0J5 L6VdKLiR5l4h37CluGEgu7WzdBTZfnVM7FiUqUOMq+kScARQBNJRRL8yeGV4rcji+BB4 uWVod+otkF3KFziq3DTmE2x7VLVHZzi8TMxWcJt9HRpa4dP+Nzw9JrYa6dIqKnfWwGdS 0New== X-Gm-Message-State: AOJu0Yz6Y62MQ5WPLufbE9hma0GbgUmtG0cRrPsUOTh25Qq2bC3MR7XO CKWhmfpV214VfHLgsuYc1yi+EU+9H10n2s50K7+F+zypy1pE8s/4eUkuZg== X-Gm-Gg: ASbGncu4zeK80Y0XID+ay/KK/2YArawdkOncM63amxHRphvCVh08JjlluhXW9Df30MO vdrfgcero0KosRTmeEly7Oq7g30VPmY6c5Igme7ShOKZ44tfB1AHB9oUH+twtwDqQRlMDxynwLX b00I970W3hYOOLxCIcFEJZp3l/NFcFFw/ADsvBRJjzXcJrG/qbOYQPvrTCyg0mhlux0iyinIPto gU8V0r9ppozAxc9Bmnuuojma+gfbdplI7G4oRy8Cs9BUhm1S66qE1xavyH/VE1HDcHLqsUaqSd6 BvZQJ5CJoWmUHW2WJO9aHOFq+6dx2ayVkpMKReXV/hDOpwKmVlX0Ms76a9Sh X-Google-Smtp-Source: AGHT+IGSrZVDm2WZez5cMsxwgUkjRqmO3bHYcI4d2TMscK+wVdUPkBUzLT073KOlccGg98huqVYeEA== X-Received: by 2002:a5d:64eb:0:b0:38f:4acd:975c with SMTP id ffacd0b85a97d-38f6e97a27dmr12593830f8f.27.1740407287299; Mon, 24 Feb 2025 06:28:07 -0800 (PST) Received: from christian-Precision-5550.lan ([2001:861:2420:9770:29b9:ffdd:d750:1ffc]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-38f259d58f3sm31713125f8f.73.2025.02.24.06.28.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Feb 2025 06:28:05 -0800 (PST) From: Christian Couder To: git@vger.kernel.org Cc: Junio C Hamano , Patrick Steinhardt , Luke Shumaker , Elijah Newren , Jeff King , Johannes Schindelin , Taylor Blau , "brian m . carlson" , Eric Sunshine , Luke Shumaker , Christian Couder Subject: [PATCH v5 3/6] fast-export: rename --signed-tags='warn' to 'warn-verbatim' Date: Mon, 24 Feb 2025 15:27:41 +0100 Message-ID: <20250224142744.279643-4-christian.couder@gmail.com> X-Mailer: git-send-email 2.48.1.401.g48e0d4203c In-Reply-To: <20250224142744.279643-1-christian.couder@gmail.com> References: <20210430232537.1131641-1-lukeshu@lukeshu.com> <20250224142744.279643-1-christian.couder@gmail.com> Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Luke Shumaker The --signed-tags= option takes one of five arguments specifying how to handle signed tags during export. Among these arguments, 'strip' is to 'warn-strip' as 'verbatim' is to 'warn' (the unmentioned argument is 'abort', which stops the fast-export process entirely). That is, signatures are either stripped or copied verbatim while exporting, with or without a warning. Match the pattern and rename 'warn' to 'warn-verbatim' to make it clear that it instructs fast-export to copy signatures verbatim. To maintain backwards compatibility, 'warn' is still recognized as deprecated synonym of 'warn-verbatim'. Signed-off-by: Luke Shumaker Signed-off-by: Christian Couder --- Documentation/git-fast-export.adoc | 6 +++--- builtin/fast-export.c | 8 ++++---- t/t9350-fast-export.sh | 18 ++++++++++++++++++ 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/Documentation/git-fast-export.adoc b/Documentation/git-fast-export.adoc index 752e4b9b01..ab9a315fa9 100644 --- a/Documentation/git-fast-export.adoc +++ b/Documentation/git-fast-export.adoc @@ -27,7 +27,7 @@ OPTIONS Insert 'progress' statements every objects, to be shown by 'git fast-import' during import. ---signed-tags=(verbatim|warn|warn-strip|strip|abort):: +--signed-tags=(verbatim|warn-verbatim|warn-strip|strip|abort):: Specify how to handle signed tags. Since any transformation after the export can change the tag names (which can also happen when excluding revisions) the signatures will not match. @@ -36,8 +36,8 @@ When asking to 'abort' (which is the default), this program will die when encountering a signed tag. With 'strip', the tags will silently be made unsigned, with 'warn-strip' they will be made unsigned but a warning will be displayed, with 'verbatim', they will be silently -exported and with 'warn', they will be exported, but you will see a -warning. +exported and with 'warn-verbatim' (or 'warn', a deprecated synonym), +they will be exported, but you will see a warning. --tag-of-filtered-object=(abort|drop|rewrite):: Specify how to handle tags whose tagged object is filtered out. diff --git a/builtin/fast-export.c b/builtin/fast-export.c index 2bf787191a..2de2adc30e 100644 --- a/builtin/fast-export.c +++ b/builtin/fast-export.c @@ -36,7 +36,7 @@ static const char *fast_export_usage[] = { }; static int progress; -static enum signed_tag_mode { SIGNED_TAG_ABORT, VERBATIM, WARN, WARN_STRIP, STRIP } signed_tag_mode = SIGNED_TAG_ABORT; +static enum signed_tag_mode { SIGNED_TAG_ABORT, VERBATIM, WARN_VERBATIM, WARN_STRIP, STRIP } signed_tag_mode = SIGNED_TAG_ABORT; static enum tag_of_filtered_mode { TAG_FILTERING_ABORT, DROP, REWRITE } tag_of_filtered_mode = TAG_FILTERING_ABORT; static enum reencode_mode { REENCODE_ABORT, REENCODE_YES, REENCODE_NO } reencode_mode = REENCODE_ABORT; static int fake_missing_tagger; @@ -62,8 +62,8 @@ static int parse_opt_signed_tag_mode(const struct option *opt, *val = SIGNED_TAG_ABORT; else if (!strcmp(arg, "verbatim") || !strcmp(arg, "ignore")) *val = VERBATIM; - else if (!strcmp(arg, "warn")) - *val = WARN; + else if (!strcmp(arg, "warn-verbatim") || !strcmp(arg, "warn")) + *val = WARN_VERBATIM; else if (!strcmp(arg, "warn-strip")) *val = WARN_STRIP; else if (!strcmp(arg, "strip")) @@ -833,7 +833,7 @@ static void handle_tag(const char *name, struct tag *tag) die("encountered signed tag %s; use " "--signed-tags= to handle it", oid_to_hex(&tag->object.oid)); - case WARN: + case WARN_VERBATIM: warning("exporting signed tag %s", oid_to_hex(&tag->object.oid)); /* fallthru */ diff --git a/t/t9350-fast-export.sh b/t/t9350-fast-export.sh index 40427883ec..cc110727fb 100755 --- a/t/t9350-fast-export.sh +++ b/t/t9350-fast-export.sh @@ -253,6 +253,24 @@ test_expect_success 'signed-tags=verbatim' ' ' +test_expect_success 'signed-tags=warn-verbatim' ' + + git fast-export --signed-tags=warn-verbatim sign-your-name >output 2>err && + grep PGP output && + test -s err + +' + +# 'warn' is a backward-compatibility alias for 'warn-verbatim'; test +# that it keeps working. +test_expect_success 'signed-tags=warn' ' + + git fast-export --signed-tags=warn sign-your-name >output 2>err && + grep PGP output && + test -s err + +' + test_expect_success 'signed-tags=strip' ' git fast-export --signed-tags=strip sign-your-name > output && From patchwork Mon Feb 24 14:27:42 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Couder X-Patchwork-Id: 13988265 Received: from mail-wr1-f44.google.com (mail-wr1-f44.google.com [209.85.221.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 91F0C1624D3 for ; Mon, 24 Feb 2025 14:28:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740407292; cv=none; b=INSiHYy+z4d4NqBshLM468P0ghUiJyz6i35u27CZn4rBnUolZCEkpKqT5C5wvXYevbG4LblwzLuKf3rcBBSQNs1vJZT9IclSQq8aRLG5cc9ad2L0B8dFcEMuf97cnGwMg5UAzWE+3nuoxEyC2mNNB6yIF0O8xDd2Njwmcgt4PVg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740407292; c=relaxed/simple; bh=0obbN3ADOZ6mqzLpV0JzABa/dElqDd1yVN6h/cGMOvk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KA5ltejjueVVhnJn/OuTR6LaBMXFdJw/FN7pEtTxUyuHaDWMh4cBsfoq77LuKXEuTBKFCnDMhOtlEdtBQNj8qceus8U+ygmr7bo41hnLGQVQahlz3GyvSfSnWyO3MfiNz1zetTWJS3bmW7oAVjLC9e2kGVNdSklDZJcySMgx3Z8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=U5ILWm5R; arc=none smtp.client-ip=209.85.221.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="U5ILWm5R" Received: by mail-wr1-f44.google.com with SMTP id ffacd0b85a97d-38f325ddbc2so3304527f8f.1 for ; Mon, 24 Feb 2025 06:28:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740407288; x=1741012088; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=32+I3UefI6ZtOoJRbviGG8HXb04GXibeUata31nYEqU=; b=U5ILWm5Rk5iqbMzUtGpoiD0JD1zZej0S7gi7Uqpt1uIZTFM9OpfT5tZBt2w5SZizYV o5tiAv/r/+LA+CQMinOMdFyDvjmmv5rTpcIL27oD8xD0dM4xsyIFao+5stp8qJ62H3ln fi5Bpe5BGsVN8nVeSBb8fmS6prU6rlAcnmrSez/GWJxUaGBkNNirgQfBz63ZdJi9IF6O olB0sY7bLVeXNE0WHv9W9mBvdAJMFdsF9BvMz4UyJxJgD6ONjQxmmhCrPjYqPBi9wATO ahPCPHmVYrC97NbvrfiO6RH7BKrsCgtdZiRj/e79bz2YNGmQ1LpJYag/Uwe1wte1ScyS twXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740407288; x=1741012088; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=32+I3UefI6ZtOoJRbviGG8HXb04GXibeUata31nYEqU=; b=D5LVKMdwxAfCW1nTOUC8s7hVakLCfHvf6bv2VbI+HQptGJLUaVdkD0neiIt4jZTrof CiBM0/tv6VkdSzih4U+3UYU5AdG00vXpK1ZdvQmV/x9059Wf5Y4kJ1Dn6fWbJBDE9nIj EOHHa7wxQdoJJKc4Ic7CDnaIchf3DAz+S5F0mXwLUxTqfJs6ZszuRAPXQDXXmxuVg6Kk 0BydbhIgaNEFPIAAVKFKfsXxb7CUx8aB82lrpI6Y77fAHWk/7AI8O0MssAMgKbV4F1tt nnZXG2B93dCjTPnflqhk8+kkJyGHcrJWxL08rZ+98zbBlEHaea/YuleVzxDzYFOBhvJ5 zQWg== X-Gm-Message-State: AOJu0YzCXkPDPr9i8bbE7of+15R1GjZlB2mJCAh8iodmtFUKLNDzGYlx knCoV+VoZSpvQu6z4YhtW/PSmdNETnKW7o6POEhEPI0skTJI7mY2Ijx+gw== X-Gm-Gg: ASbGncuXGq3RJSgthqUMFBCQFII79HwDblqc37sqzybzzYiHt6Aruuq+Bt5nHad7kEx 6LSEsKILwULTYbvAkHYVunQ+lM2QtQmnPfC6Eba1iMeVCKuk1yofHFJO2aNDV7l3OiPfAdMvKMn feSB0xmiGjnaoQHpf9xfMIgj28+4MKY4ia/7f9McIJ637KpfHeEVlT6hWC+VRgtDSyncoGSqrAW 4BAfr2UuInxGsm4DqJci9LQbvLa3c+0vJ8vFFRru/EAOubV2CUXmdzKGj7oSn9rJWJd8xWDPkmo cCB0Ket/0wPoD6bLCATKXICIQZ/zbLZXRdMd5aAStP23PYJeAqnf6PauxaTt X-Google-Smtp-Source: AGHT+IEcHSjggb7+rqEVsTwwW4IS7+Gt/eqtP0PbgSPhEupkq+DG5oM/l0b2cgChWcfzd3FU1ny04Q== X-Received: by 2002:a5d:5f50:0:b0:38d:dfdc:52b6 with SMTP id ffacd0b85a97d-38f7082601cmr9210989f8f.37.1740407288288; Mon, 24 Feb 2025 06:28:08 -0800 (PST) Received: from christian-Precision-5550.lan ([2001:861:2420:9770:29b9:ffdd:d750:1ffc]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-38f259d58f3sm31713125f8f.73.2025.02.24.06.28.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Feb 2025 06:28:07 -0800 (PST) From: Christian Couder To: git@vger.kernel.org Cc: Junio C Hamano , Patrick Steinhardt , Luke Shumaker , Elijah Newren , Jeff King , Johannes Schindelin , Taylor Blau , "brian m . carlson" , Eric Sunshine , Luke Shumaker , Christian Couder Subject: [PATCH v5 4/6] git-fast-export.txt: clarify why 'verbatim' may not be a good idea Date: Mon, 24 Feb 2025 15:27:42 +0100 Message-ID: <20250224142744.279643-5-christian.couder@gmail.com> X-Mailer: git-send-email 2.48.1.401.g48e0d4203c In-Reply-To: <20250224142744.279643-1-christian.couder@gmail.com> References: <20210430232537.1131641-1-lukeshu@lukeshu.com> <20250224142744.279643-1-christian.couder@gmail.com> Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Luke Shumaker Signed-off-by: Luke Shumaker Signed-off-by: Christian Couder --- Documentation/git-fast-export.adoc | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Documentation/git-fast-export.adoc b/Documentation/git-fast-export.adoc index ab9a315fa9..1b19f17b78 100644 --- a/Documentation/git-fast-export.adoc +++ b/Documentation/git-fast-export.adoc @@ -29,15 +29,19 @@ OPTIONS --signed-tags=(verbatim|warn-verbatim|warn-strip|strip|abort):: Specify how to handle signed tags. Since any transformation - after the export can change the tag names (which can also happen - when excluding revisions) the signatures will not match. + after the export (or during the export, such as excluding + revisions) can change the hashes being signed, the signatures + may become invalid. + When asking to 'abort' (which is the default), this program will die when encountering a signed tag. With 'strip', the tags will silently be made unsigned, with 'warn-strip' they will be made unsigned but a warning will be displayed, with 'verbatim', they will be silently exported and with 'warn-verbatim' (or 'warn', a deprecated synonym), -they will be exported, but you will see a warning. +they will be exported, but you will see a warning. 'verbatim' and +'warn-verbatim' should only be used if you know that no +transformation affecting tags will be performed, or if you do not +care that the resulting tag will have an invalid signature. --tag-of-filtered-object=(abort|drop|rewrite):: Specify how to handle tags whose tagged object is filtered out. From patchwork Mon Feb 24 14:27:43 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Couder X-Patchwork-Id: 13988266 Received: from mail-wm1-f41.google.com (mail-wm1-f41.google.com [209.85.128.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8BC0C1885B8 for ; Mon, 24 Feb 2025 14:28:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740407294; cv=none; b=mvtkaSYFSYQoqwMxcUKPcCQFi0Qx/WzEvZH4ePrN0VBgWd0xvl0Is7Zzx59CY9OeIQdmpgXHMqFulE5HxIeaJQvc+B8BETpgR0FvtRNDY9nUjQCm2AfvnlWKoJan1JZM4rOweFLrfrFIxLgfvCgRqa6rVv2N+l2/O10LctD3Nwg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740407294; c=relaxed/simple; bh=6OMdrepwjPxUEk3/zNn8RFPSlad9No9Z0ISR4Ic51Tc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MDuq3AzNhN97DlfDDwE8hXnbHK44F3/rU+cZp4BxzRWGEJ6Ur9/qM4lrYjf+Y3kozI+GM9TkM2JI9KUD8b156AWQhmcjI2Dz89kdtixOAbHR9ibLXViq00IDnxnqmHtMicQIC03xKyW3hTTRJ1xLL54XrkNeX4YK3lE61k9fpQ4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=TGHU6eWE; arc=none smtp.client-ip=209.85.128.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="TGHU6eWE" Received: by mail-wm1-f41.google.com with SMTP id 5b1f17b1804b1-43998deed24so42673095e9.2 for ; Mon, 24 Feb 2025 06:28:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740407290; x=1741012090; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=2ioiaz2miZBMCGjkMW32fo9Ji+huLQbe65DiQ8ielns=; b=TGHU6eWE2/RwiGYZUX/95gMRNqqJx92+scG+0+L8kGitbkrBgS4kqfVH7GcObKM1wI CcegeCLKgoEgQz3zp5bz65vL5nr55aiPoRhnmUrvCFxb7QlTzDUhjX01Wb53QYYXFVSC iKaI5IRqOjsH0/tVYfpE4dHGW5H++2G4DmL5oHgsC1IzkyZOXpVwDlCnQv/QoE1SjuuL NlcBzPu4j+ZbOJXDzyfyDl24+LEzEju8rzzVF7iyVhf0j/sLE9Tz87xgeXjmu7hUaF53 l95zqKR/KSLYKRxKPb0EMetaOLUD3/JC5RRSN9owli7+LfTybBlbfl0ZP21nkbHX7b/F wV+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740407290; x=1741012090; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=2ioiaz2miZBMCGjkMW32fo9Ji+huLQbe65DiQ8ielns=; b=biN39ZmJt82fHwkmGzAmNvmELADmtuekvvI2gPszqK/u3Ie9LVQssJd4WdMQ8vJklt 44MpXk6YopkJY2bo7SRhdOH85HwDceIsYzU38TLrYyaPd2l2EPTCp/jaresH7KthxJZ1 w5drPcn5GW+Le0dRQOmPRrdBItqqdOX7c0V87YZTDZIjrsS4RaZbbCzCG34A9kHu6Nxe 6sS1lNEeklMAbZM/cqqXy5SA0N1C8wAEMVfX1F6tPAqg15zJPHIzS2B6m5YCVUck4ho3 wBEP+PBbBT4BOTjWLOCq2Cz0c1NBRKpE0VyeYE/38FLXKE0BhJ17gicAy2w/1GIgypta b0vA== X-Gm-Message-State: AOJu0YzOWzhwNCpbKl4JVY3e2dnDdEDX2val+/7S2YwXBO3CwwElhjm8 EPhGP9XF3aGJtBwXY6Gfb8pehpmFmL0fxYZ7DUu4842ypKHm5kh9PbUSFQ== X-Gm-Gg: ASbGncucXqyuTQPWAXwN1UjWSZs4fu6CxFKiCecfKZxsND4gd/N5FiQsX6TmF2qqxAF HidEObykrT3lhMVmH4FT95IYL266KCiTP2+88h54c7uHnl/h6Wt6Bdlhr2tyBuFeNgCl4OQb8Tq qMOSReYrba3Di/KfpHmQ9BRuhGmHybYTJoma9N4O+YtNLjz0szBlg58hYkV36agN8AGuGxPP6pj U1vgXu5B680z0vsAwHf17KpkFWCaZgBrXrQWprOdrmzjLyVz+Q/5zfoeypD359Zub3RjMqLPK29 AlWPzIiqBKfQsg5KQ7G2+j7PDrz3n3sCYWPYTKkJebYfQsXXa7N7RV+WtHiH X-Google-Smtp-Source: AGHT+IEwtDq4Hfutbk3QpOPN8He2s3HdZNQNbo8MZKogJv2GCNUuq/Xtpu7fxmvljNZSjhgwp4bqww== X-Received: by 2002:a05:6000:1541:b0:38d:e48b:1783 with SMTP id ffacd0b85a97d-38f70825febmr10479557f8f.42.1740407289785; Mon, 24 Feb 2025 06:28:09 -0800 (PST) Received: from christian-Precision-5550.lan ([2001:861:2420:9770:29b9:ffdd:d750:1ffc]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-38f259d58f3sm31713125f8f.73.2025.02.24.06.28.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Feb 2025 06:28:08 -0800 (PST) From: Christian Couder To: git@vger.kernel.org Cc: Junio C Hamano , Patrick Steinhardt , Luke Shumaker , Elijah Newren , Jeff King , Johannes Schindelin , Taylor Blau , "brian m . carlson" , Eric Sunshine , Luke Shumaker , Christian Couder Subject: [PATCH v5 5/6] fast-export: do not modify memory from get_commit_buffer Date: Mon, 24 Feb 2025 15:27:43 +0100 Message-ID: <20250224142744.279643-6-christian.couder@gmail.com> X-Mailer: git-send-email 2.48.1.401.g48e0d4203c In-Reply-To: <20250224142744.279643-1-christian.couder@gmail.com> References: <20210430232537.1131641-1-lukeshu@lukeshu.com> <20250224142744.279643-1-christian.couder@gmail.com> Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Luke Shumaker fast-export's helper function find_encoding() takes a `const char *`, but modifies that memory despite the `const`. Ultimately, this memory came from get_commit_buffer(), and you're not supposed to modify the memory that you get from get_commit_buffer(). So, get rid of find_encoding() in favor of commit.h:find_commit_header(), which gives back a string length, rather than mutating the memory to insert a '\0' terminator. Because find_commit_header() detects the "\n\n" string that separates the headers and the commit message, move the call to be above the `message = strstr(..., "\n\n")` call. This helps readability, and allows for the value of `encoding` to be used for a better value of "..." so that the same memory doesn't need to be checked twice. Introduce a `commit_buffer_cursor` variable to avoid writing an awkward `encoding ? encoding + encoding_len : committer_end` expression. Signed-off-by: Luke Shumaker Signed-off-by: Christian Couder --- builtin/fast-export.c | 61 +++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/builtin/fast-export.c b/builtin/fast-export.c index 2de2adc30e..39d43c2a29 100644 --- a/builtin/fast-export.c +++ b/builtin/fast-export.c @@ -510,21 +510,6 @@ static void show_filemodify(struct diff_queue_struct *q, } } -static const char *find_encoding(const char *begin, const char *end) -{ - const char *needle = "\nencoding "; - char *bol, *eol; - - bol = memmem(begin, end ? end - begin : strlen(begin), - needle, strlen(needle)); - if (!bol) - return NULL; - bol += strlen(needle); - eol = strchrnul(bol, '\n'); - *eol = '\0'; - return bol; -} - static char *anonymize_ref_component(void) { static int counter; @@ -630,9 +615,11 @@ static void handle_commit(struct commit *commit, struct rev_info *rev, struct string_list *paths_of_changed_objects) { int saved_output_format = rev->diffopt.output_format; - const char *commit_buffer; + const char *commit_buffer, *commit_buffer_cursor; const char *author, *author_end, *committer, *committer_end; - const char *encoding, *message; + const char *encoding = NULL; + size_t encoding_len; + const char *message; char *reencoded = NULL; struct commit_list *p; const char *refname; @@ -641,21 +628,35 @@ static void handle_commit(struct commit *commit, struct rev_info *rev, rev->diffopt.output_format = DIFF_FORMAT_CALLBACK; parse_commit_or_die(commit); - commit_buffer = repo_get_commit_buffer(the_repository, commit, NULL); - author = strstr(commit_buffer, "\nauthor "); + commit_buffer_cursor = commit_buffer = repo_get_commit_buffer(the_repository, commit, NULL); + + author = strstr(commit_buffer_cursor, "\nauthor "); if (!author) die("could not find author in commit %s", oid_to_hex(&commit->object.oid)); author++; - author_end = strchrnul(author, '\n'); - committer = strstr(author_end, "\ncommitter "); + commit_buffer_cursor = author_end = strchrnul(author, '\n'); + + committer = strstr(commit_buffer_cursor, "\ncommitter "); if (!committer) die("could not find committer in commit %s", oid_to_hex(&commit->object.oid)); committer++; - committer_end = strchrnul(committer, '\n'); - message = strstr(committer_end, "\n\n"); - encoding = find_encoding(committer_end, message); + commit_buffer_cursor = committer_end = strchrnul(committer, '\n'); + + /* + * find_commit_header() gets a `+ 1` because + * commit_buffer_cursor points at the trailing "\n" at the end + * of the previous line, but find_commit_header() wants a + * pointer to the beginning of the next line. + */ + if (*commit_buffer_cursor == '\n') { + encoding = find_commit_header(commit_buffer_cursor + 1, "encoding", &encoding_len); + if (encoding) + commit_buffer_cursor = encoding + encoding_len; + } + + message = strstr(commit_buffer_cursor, "\n\n"); if (message) message += 2; @@ -694,16 +695,20 @@ static void handle_commit(struct commit *commit, struct rev_info *rev, if (anonymize) { reencoded = anonymize_commit_message(); } else if (encoding) { + char *buf; switch (reencode_mode) { case REENCODE_YES: - reencoded = reencode_string(message, "UTF-8", encoding); + buf = xstrfmt("%.*s", (int)encoding_len, encoding); + reencoded = reencode_string(message, "UTF-8", buf); + free(buf); break; case REENCODE_NO: break; case REENCODE_ABORT: - die("Encountered commit-specific encoding %s in commit " + die("Encountered commit-specific encoding %.*s in commit " "%s; use --reencode=[yes|no] to handle it", - encoding, oid_to_hex(&commit->object.oid)); + (int)encoding_len, encoding, + oid_to_hex(&commit->object.oid)); } } if (!commit->parents) @@ -715,7 +720,7 @@ static void handle_commit(struct commit *commit, struct rev_info *rev, (int)(author_end - author), author, (int)(committer_end - committer), committer); if (!reencoded && encoding) - printf("encoding %s\n", encoding); + printf("encoding %.*s\n", (int)encoding_len, encoding); printf("data %u\n%s", (unsigned)(reencoded ? strlen(reencoded) : message From patchwork Mon Feb 24 14:27:44 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Couder X-Patchwork-Id: 13988267 Received: from mail-wr1-f43.google.com (mail-wr1-f43.google.com [209.85.221.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5D52A18A924 for ; Mon, 24 Feb 2025 14:28:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740407296; cv=none; b=LO2uhsXa/PVoLAp7soy5ES+ejTRgHND5VEI/3x10hOYZc4qiNCsDPRCJ6bBvfcMANiENlyuZdr9KuJPeZXEhkVhGOm4I9iXXgXEFA9B6b6XyBSz760DvoMR+EuoHix5QX+vckmvMMQb/oxM8Y1qqSmJQ0+qhJX7jpUZfMXWfj7c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740407296; c=relaxed/simple; bh=/oxh2fXWRVuDpAvAvURBYG7XL87LdhFM53H1MAl8q8E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bumaMSNG2nNbD4rTWbiKUderBtwF0jfhJR9ocrA3B1hVNgV2FmcPW2d43Bke1DDYbARPvBOucq0XMIeV7VmCPo9BxIcqNXGrnvdudhJuplhyD9IzTuZueIJyvEl0EXWrly4J2OGBe4SZFy64tnvUT3VY0fzsnYgjn62HuMeqNVA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=VEd4OeVh; arc=none smtp.client-ip=209.85.221.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="VEd4OeVh" Received: by mail-wr1-f43.google.com with SMTP id ffacd0b85a97d-38f3913569fso3152875f8f.1 for ; Mon, 24 Feb 2025 06:28:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740407292; x=1741012092; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=PLGPz8KKoB4wi2whS612lbTrpywJkwxUceGSCfRgQWY=; b=VEd4OeVhlI+CG/Wh4kklamGkCHMtju19PiuQeILxJWvW/WGL14j+6BnJUU57uTk0HJ Yshl7fd3V3KhaQXD9pnF3urUGwnJ62mWZEeEBSTZyvnKdNZRoJZ5FPE46ulLwXpDZ2xW xb2AExZMjRzQhi4Ui2nSvQw5+EKZzkh6fI2B4KGwHmiPYDiHtz5Q06kcJ7sytOkIHixl w4NbADvspRJGrZxxINcJMjuY7N+iXJ+ip7IatMVapDa7QptthXGFmKMzRLXBhwvvjQWh 0AhyBfCVYH4Om+2UiBNM/XVS0bwy3zcsBPRrLu4+YmqzXCmigZV/+etv+4xc0L/BU/CT fllA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740407292; x=1741012092; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=PLGPz8KKoB4wi2whS612lbTrpywJkwxUceGSCfRgQWY=; b=oFoC6f5QxkAbEtD1FrEaqcFbagHnj8KdmqwtX3hM9EH+rHa8xSkwInwnBqAFefdqOJ mD7KUMqGS3fTqkT0nmsy39IriMfGcobqBh2kLwBY9jKoQcj7GHhRMLT2zSFt+5trjHGB 9nHdAn6NhEgO/iIYNTxiPD3XNElzDG6jO/+8QbqrYOHxlXwjrMa0No3jUvwZQWEKnVob GCt/+rYyW30/KClrodns0Y1PxEV0Bc+SpMJzbdLWiUAZ2Umvb8aG5G8W2obAbF+SpjPs Zf9kQY7sK95PhsZCqD7W+ZMy69IDagLlX+QbBUTB5lL9JfEPU5lltDyJ1dhJSzoNr3aL JVUQ== X-Gm-Message-State: AOJu0YxWEAtdg9bygXX5pldE8y14qrMFPoSCmGyyuK3mdcpELP4KuUkB CtlW/rauJw8ZcC/1vMLcX5Do07bUaQxb87GA0dN3c2DkxVzn4WJSrdQq7A== X-Gm-Gg: ASbGncvmZCwNNU4rqEqOOCndeWtlw+obOlBNRhad/3C8EoqQQ66Mjs/QmkMRgQM3CPq KVciTbVOUiyTQvIgGDbY99o79lj6Rt+cGRxj74ZNPdjNQKwaXaZX8ExZCMZuMZv9kafXylJ17kU HdjU8WJ2D+F68IE98YJXN4Dk34+YUrdwLKVjqVk18UPw7VEO6o+LUeSVA1t+oNLOzdne2LRPzDv BqKeRNeNNaR6fmmyaCYeptYX8DrtX0USfJMHPjyVkxJYqaOX31V8TiHGALWkCikq1iwmZvaBxeA m38K6A7OJvJn21fFkd7EFw67IgKSLBzovoG4Ek/tNHtXC11UzkiuAQqsimT4 X-Google-Smtp-Source: AGHT+IH1mQmAPJ09y0pSUvzkmq6jMw9xMGBFV9GQ0qT43ZtHQQsbagZlgrTR+e7WMcmMww6iVX2l+g== X-Received: by 2002:a5d:47cf:0:b0:38d:fede:54f8 with SMTP id ffacd0b85a97d-38f6f3dc975mr9560272f8f.16.1740407291787; Mon, 24 Feb 2025 06:28:11 -0800 (PST) Received: from christian-Precision-5550.lan ([2001:861:2420:9770:29b9:ffdd:d750:1ffc]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-38f259d58f3sm31713125f8f.73.2025.02.24.06.28.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Feb 2025 06:28:10 -0800 (PST) From: Christian Couder To: git@vger.kernel.org Cc: Junio C Hamano , Patrick Steinhardt , Luke Shumaker , Elijah Newren , Jeff King , Johannes Schindelin , Taylor Blau , "brian m . carlson" , Eric Sunshine , Luke Shumaker , Christian Couder Subject: [PATCH v5 6/6] fast-export, fast-import: add support for signed-commits Date: Mon, 24 Feb 2025 15:27:44 +0100 Message-ID: <20250224142744.279643-7-christian.couder@gmail.com> X-Mailer: git-send-email 2.48.1.401.g48e0d4203c In-Reply-To: <20250224142744.279643-1-christian.couder@gmail.com> References: <20210430232537.1131641-1-lukeshu@lukeshu.com> <20250224142744.279643-1-christian.couder@gmail.com> Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Luke Shumaker fast-export has a --signed-tags= option that controls how to handle tag signatures. However, there is no equivalent for commit signatures; it just silently strips the signature out of the commit (analogously to --signed-tags=strip). While signatures are generally problematic for fast-export/fast-import (because hashes are likely to change), if they're going to support tag signatures, there's no reason to not also support commit signatures. So, implement a --signed-commits= option that mirrors the --signed-tags= option. On the fast-export side, try to be as much like signed-tags as possible, in both implementation and in user-interface. This will change the default behavior to '--signed-commits=abort' from what is now '--signed-commits=strip'. In order to provide an escape hatch for users of third-party tools that call fast-export and do not yet know of the --signed-commits= option, add an environment variable 'FAST_EXPORT_SIGNED_COMMITS_NOABORT=1' that changes the default to '--signed-commits=warn-strip'. Signed-off-by: Luke Shumaker Signed-off-by: Christian Couder --- Documentation/git-fast-export.adoc | 11 +++ Documentation/git-fast-import.adoc | 18 +++++ builtin/fast-export.c | 124 ++++++++++++++++++++++++----- builtin/fast-import.c | 23 ++++++ t/t9350-fast-export.sh | 98 +++++++++++++++++++++++ 5 files changed, 254 insertions(+), 20 deletions(-) diff --git a/Documentation/git-fast-export.adoc b/Documentation/git-fast-export.adoc index 1b19f17b78..8750dd150b 100644 --- a/Documentation/git-fast-export.adoc +++ b/Documentation/git-fast-export.adoc @@ -43,6 +43,17 @@ they will be exported, but you will see a warning. 'verbatim' and transformation affecting tags will be performed, or if you do not care that the resulting tag will have an invalid signature. +--signed-commits=(verbatim|warn-verbatim|warn-strip|strip|abort):: + Specify how to handle signed commits. Behaves exactly as + '--signed-tags', but for commits. ++ +Earlier versions this command that did not have '--signed-commits' +behaved as if '--signed-commits=strip'. As an escape hatch for users +of tools that call 'git fast-export' but do not yet support +'--signed-commits', you may set the environment variable +'FAST_EXPORT_SIGNED_COMMITS_NOABORT=1' in order to change the default +from 'abort' to 'warn-strip'. + --tag-of-filtered-object=(abort|drop|rewrite):: Specify how to handle tags whose tagged object is filtered out. Since revisions and files to export can be limited by path, diff --git a/Documentation/git-fast-import.adoc b/Documentation/git-fast-import.adoc index 8e0de618c0..7b107f5e8e 100644 --- a/Documentation/git-fast-import.adoc +++ b/Documentation/git-fast-import.adoc @@ -431,12 +431,21 @@ and control the current import process. More detailed discussion Create or update a branch with a new commit, recording one logical change to the project. +//// +Yes, it's intentional that the 'gpgsig' line doesn't have a trailing +`LF`; the definition of `data` has a byte-count prefix, so it +doesn't need an `LF` to act as a terminator (and `data` also already +includes an optional trailing `LF?` just in case you want to include +one). +//// + .... 'commit' SP LF mark? original-oid? ('author' (SP )? SP LT GT SP LF)? 'committer' (SP )? SP LT GT SP LF + ('gpgsig' SP LF data)? ('encoding' SP LF)? data ('from' SP LF)? @@ -505,6 +514,15 @@ that was selected by the --date-format= command-line option. See ``Date Formats'' above for the set of supported formats, and their syntax. +`gpgsig` +^^^^^^^^ + +The optional `gpgsig` command is used to include a PGP/GPG signature +that signs the commit data. + +Here specifies which hashing algorithm is used for this +signature, either `sha1` or `sha256`. + `encoding` ^^^^^^^^^^ The optional `encoding` command indicates the encoding of the commit diff --git a/builtin/fast-export.c b/builtin/fast-export.c index 39d43c2a29..e34adb9ae8 100644 --- a/builtin/fast-export.c +++ b/builtin/fast-export.c @@ -35,8 +35,11 @@ static const char *fast_export_usage[] = { NULL }; +enum sign_mode { SIGN_ABORT, SIGN_VERBATIM, SIGN_STRIP, SIGN_WARN_VERBATIM, SIGN_WARN_STRIP }; + static int progress; -static enum signed_tag_mode { SIGNED_TAG_ABORT, VERBATIM, WARN_VERBATIM, WARN_STRIP, STRIP } signed_tag_mode = SIGNED_TAG_ABORT; +static enum sign_mode signed_tag_mode = SIGN_ABORT; +static enum sign_mode signed_commit_mode = SIGN_ABORT; static enum tag_of_filtered_mode { TAG_FILTERING_ABORT, DROP, REWRITE } tag_of_filtered_mode = TAG_FILTERING_ABORT; static enum reencode_mode { REENCODE_ABORT, REENCODE_YES, REENCODE_NO } reencode_mode = REENCODE_ABORT; static int fake_missing_tagger; @@ -53,23 +56,24 @@ static int anonymize; static struct hashmap anonymized_seeds; static struct revision_sources revision_sources; -static int parse_opt_signed_tag_mode(const struct option *opt, +static int parse_opt_sign_mode(const struct option *opt, const char *arg, int unset) { - enum signed_tag_mode *val = opt->value; - - if (unset || !strcmp(arg, "abort")) - *val = SIGNED_TAG_ABORT; + enum sign_mode *val = opt->value; + if (unset) + return 0; + else if (!strcmp(arg, "abort")) + *val = SIGN_ABORT; else if (!strcmp(arg, "verbatim") || !strcmp(arg, "ignore")) - *val = VERBATIM; + *val = SIGN_VERBATIM; else if (!strcmp(arg, "warn-verbatim") || !strcmp(arg, "warn")) - *val = WARN_VERBATIM; + *val = SIGN_WARN_VERBATIM; else if (!strcmp(arg, "warn-strip")) - *val = WARN_STRIP; + *val = SIGN_WARN_STRIP; else if (!strcmp(arg, "strip")) - *val = STRIP; + *val = SIGN_STRIP; else - return error("Unknown signed-tags mode: %s", arg); + return error("Unknown %s mode: %s", opt->long_name, arg); return 0; } @@ -611,6 +615,44 @@ static void anonymize_ident_line(const char **beg, const char **end) *end = out->buf + out->len; } +/* + * find_commit_multiline_header is similar to find_commit_header, + * except that it handles multi-line headers, rathar than simply + * returning the first line of the header. + * + * The returned string has had the ' ' line continuation markers + * removed, and points to statically allocated memory (not to memory + * within 'msg'), so it is only valid until the next call to + * find_commit_multiline_header. + * + * If the header is found, then *end is set to point at the '\n' in + * msg that immediately follows the header value. + */ +static const char *find_commit_multiline_header(const char *msg, + const char *key, + const char **end) +{ + struct strbuf val = STRBUF_INIT; + const char *bol, *eol; + size_t len; + + bol = find_commit_header(msg, key, &len); + if (!bol) + return NULL; + eol = bol + len; + strbuf_add(&val, bol, len); + + while (eol[0] == '\n' && eol[1] == ' ') { + bol = eol + 2; + eol = strchrnul(bol, '\n'); + strbuf_addch(&val, '\n'); + strbuf_add(&val, bol, eol - bol); + } + + *end = eol; + return strbuf_detach(&val, NULL); +} + static void handle_commit(struct commit *commit, struct rev_info *rev, struct string_list *paths_of_changed_objects) { @@ -619,6 +661,7 @@ static void handle_commit(struct commit *commit, struct rev_info *rev, const char *author, *author_end, *committer, *committer_end; const char *encoding = NULL; size_t encoding_len; + const char *signature_alg = NULL, *signature = NULL; const char *message; char *reencoded = NULL; struct commit_list *p; @@ -645,17 +688,25 @@ static void handle_commit(struct commit *commit, struct rev_info *rev, commit_buffer_cursor = committer_end = strchrnul(committer, '\n'); /* - * find_commit_header() gets a `+ 1` because - * commit_buffer_cursor points at the trailing "\n" at the end - * of the previous line, but find_commit_header() wants a + * find_commit_header() and find_commit_multiline_header() get + * a `+ 1` because commit_buffer_cursor points at the trailing + * "\n" at the end of the previous line, but they want a * pointer to the beginning of the next line. */ + if (*commit_buffer_cursor == '\n') { encoding = find_commit_header(commit_buffer_cursor + 1, "encoding", &encoding_len); if (encoding) commit_buffer_cursor = encoding + encoding_len; } + if (*commit_buffer_cursor == '\n') { + if ((signature = find_commit_multiline_header(commit_buffer_cursor + 1, "gpgsig", &commit_buffer_cursor))) + signature_alg = "sha1"; + else if ((signature = find_commit_multiline_header(commit_buffer_cursor + 1, "gpgsig-sha256", &commit_buffer_cursor))) + signature_alg = "sha256"; + } + message = strstr(commit_buffer_cursor, "\n\n"); if (message) message += 2; @@ -719,6 +770,31 @@ static void handle_commit(struct commit *commit, struct rev_info *rev, printf("%.*s\n%.*s\n", (int)(author_end - author), author, (int)(committer_end - committer), committer); + if (signature) { + switch (signed_commit_mode) { + case SIGN_ABORT: + die("encountered signed commit %s; use " + "--signed-commits= to handle it", + oid_to_hex(&commit->object.oid)); + case SIGN_WARN_VERBATIM: + warning("exporting signed commit %s", + oid_to_hex(&commit->object.oid)); + /* fallthru */ + case SIGN_VERBATIM: + printf("gpgsig %s\ndata %u\n%s", + signature_alg, + (unsigned)strlen(signature), + signature); + break; + case SIGN_WARN_STRIP: + warning("stripping signature from commit %s", + oid_to_hex(&commit->object.oid)); + /* fallthru */ + case SIGN_STRIP: + break; + } + free((char *)signature); + } if (!reencoded && encoding) printf("encoding %.*s\n", (int)encoding_len, encoding); printf("data %u\n%s", @@ -834,21 +910,21 @@ static void handle_tag(const char *name, struct tag *tag) "\n-----BEGIN PGP SIGNATURE-----\n"); if (signature) switch (signed_tag_mode) { - case SIGNED_TAG_ABORT: + case SIGN_ABORT: die("encountered signed tag %s; use " "--signed-tags= to handle it", oid_to_hex(&tag->object.oid)); - case WARN_VERBATIM: + case SIGN_WARN_VERBATIM: warning("exporting signed tag %s", oid_to_hex(&tag->object.oid)); /* fallthru */ - case VERBATIM: + case SIGN_VERBATIM: break; - case WARN_STRIP: + case SIGN_WARN_STRIP: warning("stripping signature from tag %s", oid_to_hex(&tag->object.oid)); /* fallthru */ - case STRIP: + case SIGN_STRIP: message_size = signature + 1 - message; break; } @@ -1194,6 +1270,7 @@ int cmd_fast_export(int argc, const char *prefix, struct repository *repo UNUSED) { + const char *env_signed_commits_noabort; struct rev_info revs; struct commit *commit; char *export_filename = NULL, @@ -1207,7 +1284,10 @@ int cmd_fast_export(int argc, N_("show progress after objects")), OPT_CALLBACK(0, "signed-tags", &signed_tag_mode, N_("mode"), N_("select handling of signed tags"), - parse_opt_signed_tag_mode), + parse_opt_sign_mode), + OPT_CALLBACK(0, "signed-commits", &signed_commit_mode, N_("mode"), + N_("select handling of signed commits"), + parse_opt_sign_mode), OPT_CALLBACK(0, "tag-of-filtered-object", &tag_of_filtered_mode, N_("mode"), N_("select handling of tags that tag filtered objects"), parse_opt_tag_of_filtered_mode), @@ -1248,6 +1328,10 @@ int cmd_fast_export(int argc, if (argc == 1) usage_with_options (fast_export_usage, options); + env_signed_commits_noabort = getenv("FAST_EXPORT_SIGNED_COMMITS_NOABORT"); + if (env_signed_commits_noabort && *env_signed_commits_noabort) + signed_commit_mode = SIGN_WARN_STRIP; + /* we handle encodings */ git_config(git_default_config, NULL); diff --git a/builtin/fast-import.c b/builtin/fast-import.c index d6a368a566..a5b33eb91e 100644 --- a/builtin/fast-import.c +++ b/builtin/fast-import.c @@ -2719,10 +2719,13 @@ static struct hash_list *parse_merge(unsigned int *count) static void parse_new_commit(const char *arg) { + static struct strbuf sig = STRBUF_INIT; static struct strbuf msg = STRBUF_INIT; + struct string_list siglines = STRING_LIST_INIT_NODUP; struct branch *b; char *author = NULL; char *committer = NULL; + char *sig_alg = NULL; char *encoding = NULL; struct hash_list *merge_list = NULL; unsigned int merge_count; @@ -2746,6 +2749,13 @@ static void parse_new_commit(const char *arg) } if (!committer) die("Expected committer but didn't get one"); + if (skip_prefix(command_buf.buf, "gpgsig ", &v)) { + sig_alg = xstrdup(v); + read_next_command(); + parse_data(&sig, 0, NULL); + read_next_command(); + } else + strbuf_setlen(&sig, 0); if (skip_prefix(command_buf.buf, "encoding ", &v)) { encoding = xstrdup(v); read_next_command(); @@ -2819,10 +2829,23 @@ static void parse_new_commit(const char *arg) strbuf_addf(&new_data, "encoding %s\n", encoding); + if (sig_alg) { + if (!strcmp(sig_alg, "sha1")) + strbuf_addstr(&new_data, "gpgsig "); + else if (!strcmp(sig_alg, "sha256")) + strbuf_addstr(&new_data, "gpgsig-sha256 "); + else + die("Expected gpgsig algorithm sha1 or sha256, got %s", sig_alg); + string_list_split_in_place(&siglines, sig.buf, "\n", -1); + strbuf_add_separated_string_list(&new_data, "\n ", &siglines); + strbuf_addch(&new_data, '\n'); + } strbuf_addch(&new_data, '\n'); strbuf_addbuf(&new_data, &msg); + string_list_clear(&siglines, 1); free(author); free(committer); + free(sig_alg); free(encoding); if (!store_object(OBJ_COMMIT, &new_data, NULL, &b->oid, next_mark)) diff --git a/t/t9350-fast-export.sh b/t/t9350-fast-export.sh index cc110727fb..304bac5b1d 100755 --- a/t/t9350-fast-export.sh +++ b/t/t9350-fast-export.sh @@ -8,6 +8,7 @@ GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME . ./test-lib.sh +. "$TEST_DIRECTORY/lib-gpg.sh" test_expect_success 'setup' ' @@ -284,10 +285,107 @@ test_expect_success 'signed-tags=warn-strip' ' test -s err ' +test_expect_success GPG 'set up signed commit' ' + + # Generate a commit with both "gpgsig" and "encoding" set, so + # that we can test that fast-import gets the ordering correct + # between the two. + test_config i18n.commitEncoding ISO-8859-1 && + git checkout -f -b commit-signing main && + echo Sign your name >file-sign && + git add file-sign && + git commit -S -m "signed commit" && + COMMIT_SIGNING=$(git rev-parse --verify commit-signing) + +' + +test_expect_success GPG 'signed-commits default' ' + + sane_unset FAST_EXPORT_SIGNED_COMMITS_NOABORT && + test_must_fail git fast-export --reencode=no commit-signing && + + FAST_EXPORT_SIGNED_COMMITS_NOABORT=1 git fast-export --reencode=no commit-signing >output 2>err && + ! grep ^gpgsig output && + grep "^encoding ISO-8859-1" output && + test -s err && + sed "s/commit-signing/commit-strip-signing/" output | ( + cd new && + git fast-import && + STRIPPED=$(git rev-parse --verify refs/heads/commit-strip-signing) && + test $COMMIT_SIGNING != $STRIPPED + ) + +' + +test_expect_success GPG 'signed-commits=abort' ' + + test_must_fail git fast-export --signed-commits=abort commit-signing + +' + +test_expect_success GPG 'signed-commits=verbatim' ' + + git fast-export --signed-commits=verbatim --reencode=no commit-signing >output && + grep "^gpgsig sha" output && + grep "encoding ISO-8859-1" output && + ( + cd new && + git fast-import && + STRIPPED=$(git rev-parse --verify refs/heads/commit-signing) && + test $COMMIT_SIGNING = $STRIPPED + ) output 2>err && + grep "^gpgsig sha" output && + grep "encoding ISO-8859-1" output && + test -s err && + ( + cd new && + git fast-import && + STRIPPED=$(git rev-parse --verify refs/heads/commit-signing) && + test $COMMIT_SIGNING = $STRIPPED + ) output && + ! grep ^gpgsig output && + grep "^encoding ISO-8859-1" output && + sed "s/commit-signing/commit-strip-signing/" output | ( + cd new && + git fast-import && + STRIPPED=$(git rev-parse --verify refs/heads/commit-strip-signing) && + test $COMMIT_SIGNING != $STRIPPED + ) + +' + +test_expect_success GPG 'signed-commits=warn-strip' ' + + git fast-export --signed-commits=warn-strip --reencode=no commit-signing >output 2>err && + ! grep ^gpgsig output && + grep "^encoding ISO-8859-1" output && + test -s err && + sed "s/commit-signing/commit-strip-signing/" output | ( + cd new && + git fast-import && + STRIPPED=$(git rev-parse --verify refs/heads/commit-strip-signing) && + test $COMMIT_SIGNING != $STRIPPED + ) + +' + test_expect_success 'setup submodule' ' test_config_global protocol.file.allow always && git checkout -f main && + test_might_fail git update-ref -d refs/heads/commit-signing && mkdir sub && ( cd sub &&