Tarantool development patches archive
 help / color / mirror / Atom feed
From: Aleksandr Lyapunov via Tarantool-patches <tarantool-patches@dev.tarantool.org>
To: tarantool-patches@dev.tarantool.org
Cc: alexander.turenko@tarantool.org
Subject: [Tarantool-patches] [PATCH] tools: add a script that checks submodules' commits
Date: Thu, 18 Mar 2021 14:24:31 +0300	[thread overview]
Message-ID: <1616066671-24689-1-git-send-email-alyapunov@tarantool.org> (raw)

Sometimes to fix an issue we need to patch our submodule, update it
in tarantool and then patch tarantool using changes in submodule.

During development and review stages we have to create a branch (S)
in submodule and a branch (T) in tarantool that references head of
(S) branch.

When the fix is merged to mater it's very simple to make a mistake:
merge-and-push submodule's branch S and then tarantool's branch T.
It sounds obvious, but that's wrong: tarantool's master should
reference a commit from submodule's master, not a commit from
temporary developer's branch.

It's not hard to fix it but still a maintainer must always remember
that problem. In order to simplify their life it was decided to
create a script that is designed to check such thing before pushing
tarantool to origin/master.

Here is it, with simple usage:
./tools/check_push_master.sh && git push origin master
---
 tools/check_push_master.sh | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)
 create mode 100755 tools/check_push_master.sh

diff --git a/tools/check_push_master.sh b/tools/check_push_master.sh
new file mode 100755
index 0000000..5bc2762
--- /dev/null
+++ b/tools/check_push_master.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+# This script is recommended to run before pushing master to origin.
+# It fails (returns 1) if a problem detected, see output.
+exit_status=0
+
+# Check that submodules' commits are from their master branches.
+# The script checks all submodules, but fails only for the following list:
+our_submodules="src/lib/msgpuck:src/lib/small:test-run"
+
+function check_submodule() {
+    local submodule_path=$1
+    local commit=$2
+    git "--git-dir=$(git rev-parse --show-toplevel)/$submodule_path/.git" branch -r --contains $commit | egrep " origin/master$" > /dev/null
+    local commit_is_from_master=$?
+    [[ ":$our_submodules:" =~ ":$submodule_path:" ]]
+    local it_is_our_submodule=$?
+    if [[ $it_is_our_submodule -eq 0 ]] && [[ $commit_is_from_master -eq 1 ]]; then
+        echo "Submodule $submodule_path is set to commit $commit that is not in master branch!"
+        exit_status=1
+    fi
+}
+
+while read -r line; do
+    check_submodule $line
+done <<<"`git "--git-dir=$(git rev-parse --show-toplevel)/.git" ls-tree -r HEAD | egrep "^[0-9]+ commit" | awk '{print $4 " " $3}'`"
+
+# Done
+exit $exit_status
\ No newline at end of file
-- 
2.7.4


             reply	other threads:[~2021-03-18 11:24 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-18 11:24 Aleksandr Lyapunov via Tarantool-patches [this message]
2021-03-24  0:25 ` Alexander Turenko via Tarantool-patches

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1616066671-24689-1-git-send-email-alyapunov@tarantool.org \
    --to=tarantool-patches@dev.tarantool.org \
    --cc=alexander.turenko@tarantool.org \
    --cc=alyapunov@tarantool.org \
    --subject='Re: [Tarantool-patches] [PATCH] tools: add a script that checks submodules'\'' commits' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox