[PATCH v3] Add a commit.signoff configuration option to always use --signoff in commit
The intent is that it only applies when the user runs `git commit` themselves, hence a number of commands (rebase and revert/cherry-pick) have started passing --no-signoff when invoking commit.
Signed-off-by: Adeodato Simó <dato@net.com.org.es>
---
Hello, I've worked a bit more on this patch, and I'd like to know if it's going in a good direction or not. Changes since v2:
t/t7500-commit.sh | 22 ++++++++++++++++++++++
* add tests to check that commit.signoff works correctly, and that
is overriden by --no-signoff git-rebase.sh | 2 +-
t/t3402-rebase-merge.sh | 6 +++++-
* make git-rebase pass --no-signoff when invoking `git commit`, and
add a test for it
builtin-revert.c | 2 ++ * make revert/cherry-pick pass --no-signoff unless -s was given by
the user (missing test)
Documentation/config.txt | 4 ++-- * improve config.txt wording as per <20081227120128.GA11322@chistera.yi.org>
(I don't know if it's customary to send a diff from v2 to v3, if it is please let me know.)
Thanks,
Documentation/config.txt | 9 +++++++++
Documentation/git-commit.txt | 3 ++-
builtin-commit.c | 5 +++++
builtin-revert.c | 2 ++
git-rebase.sh | 2 +-
t/t3402-rebase-merge.sh | 6 +++++-
t/t7500-commit.sh | 22 ++++++++++++++++++++++
7 files changed, 46 insertions(+), 3 deletions(-)
Show changes to 7 files +46 −3
Documentation/config.txt, Documentation/git-commit.txt, builtin-commit.c, builtin-revert.c, git-rebase.sh, t/t3402-rebase-merge.sh, t/t7500-commit.sh
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 52786c7..13f2200 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -591,6 +591,15 @@ color.ui::
commit.template::
Specify a file to use as the template for new commit messages.
+commit.signoff::
+ If set, 'git commit' will behave as if '-s' option was given.
+ Please use this option with care: by enabling it globally, you'd
+ be stating that all your commits will invariably meet the S-o-b
+ requirements for any project you send patches to. It's probably
+ best to only use it from your private repositories' .git/config
+ file, and only for projects who require a S-o-b as proof of
+ provenance of the patch, and not of its correctness or quality.
+
diff.autorefreshindex::
When using 'git-diff' to compare with work tree
files, do not consider stat-only change as changed.
diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt
index b5d81be..abab839 100644
--- a/Documentation/git-commit.txt
+++ b/Documentation/git-commit.txt
@@ -96,7 +96,8 @@ OPTIONS
-s::
--signoff::
Add Signed-off-by line by the committer at the end of the commit
- log message.
+ log message. This overrides the `commit.signoff` configuration
+ variable.
-n::
--no-verify::
diff --git a/builtin-commit.c b/builtin-commit.c
index e88b78f..fc09539 100644
--- a/builtin-commit.c
+++ b/builtin-commit.c
@@ -929,6 +929,11 @@ static int git_commit_config(const char *k, const char *v, void *cb)
if (!strcmp(k, "commit.template"))
return git_config_string(&template_file, k, v);
+ if (!strcmp(k, "commit.signoff")) {
+ signoff = git_config_bool(k, v);
+ return 0;
+ }
+
return git_status_config(k, v, cb);
}
diff --git a/builtin-revert.c b/builtin-revert.c
index d48313c..395c7a5 100644
--- a/builtin-revert.c
+++ b/builtin-revert.c
@@ -429,6 +429,8 @@ static int revert_or_cherry_pick(int argc, const char **argv)
args[i++] = "-n";
if (signoff)
args[i++] = "-s";
+ else
+ args[i++] = "--no-signoff";
if (!edit) {
args[i++] = "-F";
args[i++] = defmsg;
diff --git a/git-rebase.sh b/git-rebase.sh
index ebd4df3..bf520d0 100755
--- a/git-rebase.sh
+++ b/git-rebase.sh
@@ -63,7 +63,7 @@ continue_merge () {
cmt=`cat "$dotest/current"`
if ! git diff-index --quiet --ignore-submodules HEAD --
then
- if ! git commit --no-verify -C "$cmt"
+ if ! git commit --no-verify --no-signoff -C "$cmt"
then
echo "Commit failed, please do not call \"git commit\""
echo "directly, but instead do one of the following: "
diff --git a/t/t3402-rebase-merge.sh b/t/t3402-rebase-merge.sh
index 7b7d072..bd2d08c 100755
--- a/t/t3402-rebase-merge.sh
+++ b/t/t3402-rebase-merge.sh
@@ -41,7 +41,8 @@ test_expect_success setup '
git branch test-rebase side &&
git branch test-rebase-pick side &&
git branch test-reference-pick side &&
- git checkout -b test-merge side
+ git checkout -b test-merge side &&
+ git config commit.signoff true
'
test_expect_success 'reference merge' '
@@ -54,6 +55,9 @@ test_expect_success rebase '
GIT_TRACE=1 git rebase --merge master
'
+test_expect_success 'rebase uses --no-signoff' '
+ !(git log | grep -q Signed-off-by)'
+
test_expect_success 'test-rebase@{1} is pre rebase' '
test $PRE_REBASE = $(git rev-parse test-rebase@{1})
'
diff --git a/t/t7500-commit.sh b/t/t7500-commit.sh
index 6e18a96..c7deb3e 100755
--- a/t/t7500-commit.sh
+++ b/t/t7500-commit.sh
@@ -147,6 +147,10 @@ zort
Signed-off-by: C O Mitter <committer@example.com>
EOF
+cat > expect_no_signoff << EOF
+zort
+EOF
+
test_expect_success '--signoff' '
echo "yet another content *narf*" >> foo &&
echo "zort" | (
@@ -157,6 +161,24 @@ test_expect_success '--signoff' '
test_cmp expect output
'
+test_expect_success 'commit.signoff' '
+ echo "and more content" >> foo &&
+ git config commit.signoff true &&
+ echo "zort" | git commit -F - foo &&
+ git config --unset commit.signoff &&
+ git cat-file commit HEAD | sed "1,/^$/d" > output &&
+ test_cmp expect output
+'
+
+test_expect_success '--no-signoff trumps commit.signoff' '
+ echo "and even more" >> foo &&
+ git config commit.signoff true &&
+ echo "zort" | git commit --no-signoff -F - foo &&
+ git config --unset commit.signoff &&
+ git cat-file commit HEAD | sed "1,/^$/d" > output &&
+ test_cmp expect_no_signoff output
+'
+
test_expect_success 'commit message from file (1)' '
mkdir subdir &&
echo "Log in top directory" >log &&
--
1.6.1.307.g07803