From patchwork Tue Oct 24 19:56:55 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "brian m. carlson" X-Patchwork-Id: 13435229 Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net [23.128.96.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0A5332900 for ; Tue, 24 Oct 2023 19:58:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (3072-bit key) header.d=crustytoothpaste.net header.i=@crustytoothpaste.net header.b="oPACWnSY" Received: from ring.crustytoothpaste.net (ring.crustytoothpaste.net [IPv6:2600:3c04::f03c:92ff:fe9e:c6d8]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EDD4A10C6 for ; Tue, 24 Oct 2023 12:58:03 -0700 (PDT) Received: from tapette.crustytoothpaste.net (unknown [IPv6:2001:470:b056:101:5e4a:89fa:93b9:2058]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by ring.crustytoothpaste.net (Postfix) with ESMTPSA id 17EAB5B092; Tue, 24 Oct 2023 19:58:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=crustytoothpaste.net; s=default; t=1698177483; bh=X+XcZe4iWlW5bC3/6mTpsVbNZREe5wyhsPWtwchJseA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Reply-To: Subject:Date:To:CC:Resent-Date:Resent-From:Resent-To:Resent-Cc: In-Reply-To:References:Content-Type:Content-Disposition; b=oPACWnSYh2wSt/8DnyBce9qw8vU6y9sz6xZDBJud7tbUMwOusI4l2OnxwANgepF5y /LIZtqa+EmtDDoFzyX2AtGg29y3M8BemymP+n0p7qqT9afVSJkeqq+5CUSWp2H2Nf2 trl/4h758xty1JvLuN9M9H1nmjTLWobHUT/a7JRD3hUCMuGGDJgn5gEeT8Ohl4M0hC cU5BYRIqnE0UyooUG9pNBbwcwSctGhSLQkiX/tNEL/i5KIH2OvW4Ptw1rgfvMQBSgK l11MU7f3YKvvWQJgjHpEykyRIlkl8pdDVQVw+0Hwm32CukC8TmePS4lMioBQai6sJb WzYTPBfVNFgNXfCyor1tN/4W4jnttYa+skPyhOGY9Nj8CDJicmMXJ8axwZokaHsdnM sKirzwi7fjhzEuKyes8f0M71JO8tv4dj3y35Wge8VSpe8krBOXmLTVKCSXdpwuxF/I wVH6vBFgiBbIx2VOMcKFeaERL2i8GdBEZhNt8NgpdhvC8EbF33p From: "brian m. carlson" To: Cc: Junio C Hamano , Elijah Newren , Phillip Wood Subject: [PATCH 1/1] merge-file: add an option to process object IDs Date: Tue, 24 Oct 2023 19:56:55 +0000 Message-ID: <20231024195655.2413191-2-sandals@crustytoothpaste.net> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20231024195655.2413191-1-sandals@crustytoothpaste.net> References: <20231024195655.2413191-1-sandals@crustytoothpaste.net> Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Spam-Level: * From: "brian m. carlson" git merge-file knows how to merge files on the file system already. It would be helpful, however, to allow it to also merge single blobs. Teach it an `--object-id` option which means that its arguments are object IDs and not files to allow it to do so. Since we obviously won't be writing the data to the first argument, either write to the object store and print the object ID, or honor the -p argument and print it to standard out. We handle the empty blob specially since read_mmblob doesn't read it directly, instead throwing an error, and otherwise users cannot specify an empty ancestor. Signed-off-by: brian m. carlson --- Documentation/git-merge-file.txt | 20 +++++++++++ builtin/merge-file.c | 58 +++++++++++++++++++++++--------- t/t6403-merge-file.sh | 58 ++++++++++++++++++++++++++++++++ 3 files changed, 120 insertions(+), 16 deletions(-) diff --git a/Documentation/git-merge-file.txt b/Documentation/git-merge-file.txt index 7e9093fab6..45460f3916 100644 --- a/Documentation/git-merge-file.txt +++ b/Documentation/git-merge-file.txt @@ -12,6 +12,9 @@ SYNOPSIS 'git merge-file' [-L [-L [-L ]]] [--ours|--theirs|--union] [-p|--stdout] [-q|--quiet] [--marker-size=] [--[no-]diff3] +'git merge-file' --object-id [-L [-L [-L ]]] + [--ours|--theirs|--union] [-q|--quiet] [--marker-size=] + [--[no-]diff3] DESCRIPTION @@ -40,6 +43,10 @@ however, these conflicts are resolved favouring lines from ``, lines from ``, or lines from both respectively. The length of the conflict markers can be given with the `--marker-size` option. +If `--object-id` is specified, exactly the same behavior occurs, except that +instead of specifying what to merge as files, it is specified as a list of +object IDs referring to blobs. + The exit value of this program is negative on error, and the number of conflicts otherwise (truncated to 127 if there are more than that many conflicts). If the merge was clean, the exit value is 0. @@ -52,6 +59,14 @@ linkgit:git[1]. OPTIONS ------- +--object-id:: + Specify the contents to merge as blobs in the current repository instead of + files. In this case, the operation must take place within a valid repository. ++ +If the `-p` option is specified, the merged file (including conflicts, if any) +goes to standard output as normal; otherwise, the merged file is written to the +object store and the object ID of its blob is written to standard output. + -L