From f9bd24c201decea60193145c8f07cb18f2ec50ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@linux.intel.com> Date: Wed, 15 Mar 2017 17:09:04 +0200 Subject: [PATCH] dim: Add extract-tags command MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a command for extracting various tags (eg. Reviwed-by:) from emails. You can give the comamnd a rangeish to add the tags from the same email to multiple already applied patches. The regexp used to pick up tags is purposefully quite broad. People tend to typo these things, or add extra whitespace etc. However the broad regexp does mean this occasionally picks up stuff that isn't a tag. So manually amending the commit is probably a wise idea, and so I simply decided to also leave a '--- extracted tags ---' separator in the commit message just before the extracted tags, which can be cleaned up manually when verifying that the tags look correct. v2: Drop the aliases Remove the temp file Clean up locals Other codingstyle cleanups Use '# *** ... ***' for the separator Cc: Jani Nikula <jani.nikula@linux.intel.com> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Jani Nikula <jani.nikula@intel.com> --- dim | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/dim b/dim index f1ca50f..c62531a 100755 --- a/dim +++ b/dim @@ -333,6 +333,28 @@ if message_id is not None: EOF } +message_print_body () +{ + python2 <<EOF +import email + +def print_part(part): + mtype = part.get_content_maintype() + if mtype == 'text': + print(part.get_payload(decode=True)) + +def print_msg(file): + msg = email.message_from_file(file) + if msg.is_multipart(): + for part in msg.get_payload(): + print_part(part) + else: + print_part(msg) + +print_msg(open('$1', 'r')) +EOF +} + # append all arguments as tags at the end of the commit message of HEAD function dim_commit_add_tag { @@ -1048,6 +1070,48 @@ function rangeish() fi } +function dim_extract_tags +{ + local branch range file tags + + branch=$1 + shift + range=$(rangeish "$1") + file=$(mktemp) + + assert_branch $branch + assert_repo_clean + + cat > $file + + tags=$(message_print_body "$file" | grep -ai '^[^>]*[A-Za-z-]\+: [^ ]') + + rm -f $file + + if [[ -z "$tags" ]]; then + return 0 + fi + + tags=$(printf -- "# *** extracted tags ***\n%s" "$tags") + + git filter-branch -f --msg-filter "cat ; echo \"$tags\"" $range +} + +function dim_extract_queued +{ + dim_extract_tags drm-intel-next-queued "$@" +} + +function dim_extract_fixes +{ + dim_extract_tags drm-intel-fixes "$@" +} + +function dim_extract_next_fixes +{ + dim_extract_tags drm-intel-next-fixes "$@" +} + dim_alias_check_patch=checkpatch dim_alias_cp=checkpatch function dim_checkpatch -- GitLab