[Intel-gfx] [dim PATCH v2 3/7] dim: do not do local variable assignments in declaration
Jani Nikula
jani.nikula at intel.com
Thu Nov 24 15:32:36 UTC 2016
We rely on 'set -e' to bail out on errors. We also do a lot of local
variable assignments with command substitution like this:
local foo=$(bar)
However, that masks the return value of the command, failing to bail out
on errors. Split up local variable declarations from assignments to
avoid the problems.
There are no issues with literal assignments like
local foo="bar"
but split those out too for more uniform code, preferring to have local
declarations in the beginning of functions or nested blocks.
Details at
http://stackoverflow.com/questions/4421257/why-does-local-sweep-the-return-code-of-a-command
Signed-off-by: Jani Nikula <jani.nikula at intel.com>
---
dim | 202 +++++++++++++++++++++++++++++++++++++++++++-------------------------
1 file changed, 129 insertions(+), 73 deletions(-)
diff --git a/dim b/dim
index d450474dc8f4..1d52d509450d 100755
--- a/dim
+++ b/dim
@@ -199,14 +199,16 @@ fi
function url_to_remote # url
{
- local url="$1"
+ local url remote
+
+ url="$1"
if [[ -z "$url" ]]; then
echoerr "$0 without url"
exit 1
fi
- local remote=$(git remote -v | grep -m 1 "$url" | cut -f 1)
+ remote=$(git remote -v | grep -m 1 "$url" | cut -f 1)
if [[ -z "$remote" ]]; then
echoerr "No git remote for url $url found in $(pwd)"
@@ -221,7 +223,9 @@ function url_to_remote # url
function branch_to_remote # branch
{
- local remote=`git rev-parse --abbrev-ref --symbolic-full-name $1@{upstream}`
+ local remote
+
+ remote=`git rev-parse --abbrev-ref --symbolic-full-name $1@{upstream}`
remote=${remote%%/*}
echo $remote
@@ -248,7 +252,9 @@ function branch_to_repo # branch
function dim_uptodate
{
- local using="${BASH_SOURCE[0]}"
+ local using
+
+ using="${BASH_SOURCE[0]}"
if [[ ! -e "$using" ]]; then
echoerr "could not figure out the version being used ($using)."
@@ -300,19 +306,21 @@ function dim_commit_add_tag
# update for-linux-next and for-linux-next-fixes branches
function update_linux_next # branch next next-fixes fixes
{
+ local branch linux_next linux_next_fixes linux_fixes repo remote
+
cd $DIM_PREFIX/drm-tip
- local branch=$1
- local linux_next=$2
- local linux_next_fixes=$3
- local linux_fixes=$4
+ branch=$1
+ linux_next=$2
+ linux_next_fixes=$3
+ linux_fixes=$4
- local repo=`branch_to_repo $branch`
+ repo=`branch_to_repo $branch`
if [[ $repo != `branch_to_repo $linux_next` ]] ; then
return
fi
- local remote=`repo_to_remote $repo`
+ remote=`repo_to_remote $repo`
git fetch -q $remote || true
@@ -379,12 +387,14 @@ function dim_revert_rerere
dim_alias_rebuild_nightly=rebuild-tip
function dim_rebuild_tip
{
- local integration_branch=drm-tip
- local specfile=`mktemp`
- local time="`date --utc +%Yy-%mm-%dd-%Hh-%Mm-%Ss` UTC"
- local first=1
+ local integration_branch specfile time first rerere repo url remote
- local rerere=$DIM_PREFIX/drm-rerere
+ integration_branch=drm-tip
+ specfile=`mktemp`
+ time="`date --utc +%Yy-%mm-%dd-%Hh-%Mm-%Ss` UTC"
+ first=1
+
+ rerere=$DIM_PREFIX/drm-rerere
cd $rerere
if [[ `git status --porcelain | grep -v "^[ ?][ ?]" | wc -l` -gt 0 ]]; then
@@ -406,8 +416,8 @@ function dim_rebuild_tip
fi
for repo in "${!drm_tip_repos[@]}"; do
- local url=${drm_tip_repos[$repo]}
- local remote=$(url_to_remote $url)
+ url=${drm_tip_repos[$repo]}
+ remote=$(url_to_remote $url)
echo -n "Fetching $repo (as $remote) ... "
# git fetch returns 128 if there's nothing to be fetched
git fetch -q $remote || true
@@ -416,11 +426,12 @@ function dim_rebuild_tip
# merge -fixes
for conf in "${drm_tip_config[@]}"; do
- local repo branch override
+ local branch override sha1 fixup_file
+
read repo branch override <<< $conf
- local url=${drm_tip_repos[$repo]}
- local remote=$(url_to_remote $url)
- local sha1=$remote/$branch
+ url=${drm_tip_repos[$repo]}
+ remote=$(url_to_remote $url)
+ sha1=$remote/$branch
echo -n "Merging $repo (local remote $remote) $branch... "
@@ -438,7 +449,7 @@ function dim_rebuild_tip
echo "Fast-forward. Done."
true
else
- local fixup_file=$rerere/$repo-${branch//\//-}-fixup.patch
+ fixup_file=$rerere/$repo-${branch//\//-}-fixup.patch
echo $fixup_file > .fixup_file_path
git merge --rerere-autoupdate --no-commit $sha1 >& /dev/null || true
@@ -466,15 +477,15 @@ function dim_rebuild_tip
git commit --quiet -m "$integration_branch: $time integration manifest"
echo "Done."
- local tip_remote=`url_to_remote $drm_tip_ssh`
+ remote=`url_to_remote $drm_tip_ssh`
echo -n "Pushing $integration_branch... "
- git push $DRY_RUN $tip_remote +HEAD >& /dev/null && echo "Done."
+ git push $DRY_RUN $remote +HEAD >& /dev/null && echo "Done."
echo -n "Updating rerere cache... "
cd $rerere
if git branch --list rerere-cache | grep -q '\*' ; then
- local rerere_remote=`branch_to_remote rerere-cache`
+ remote=`branch_to_remote rerere-cache`
git pull >& /dev/null
rm `rr_cache_dir`/rr-cache -Rf &> /dev/null || true
@@ -488,7 +499,7 @@ function dim_rebuild_tip
echo -n "Nothing changed. "
fi
echo -n "Pushing rerere cache... "
- git push $DRY_RUN $rerere_remote HEAD >& /dev/null && echo "Done."
+ git push $DRY_RUN $remote HEAD >& /dev/null && echo "Done."
else
echo "Fail: Branch setup for the rerere-cache is borked."
exit 1
@@ -498,17 +509,19 @@ function dim_rebuild_tip
# push.
function dim_push_branch
{
+ local branch remote
+
if [[ "x$1" = "x" ]]; then
echo "usage: $dim $subcommand branch"
exit 1
fi
- local branch=$1
+ branch=$1
shift
assert_branch $branch
- local remote=`branch_to_remote $branch`
+ remote=`branch_to_remote $branch`
git push $DRY_RUN $remote $branch "$@"
@@ -542,20 +555,21 @@ dim_alias_ab=apply-branch
dim_alias_sob=apply-branch
function dim_apply_branch
{
- local branch=$1
+ local branch file message_id commiter_email patch_from sob
+
+ branch=$1
shift
- local file=`mktemp`
+ file=`mktemp`
assert_branch $branch
assert_repo_clean
cat > $file
- local message_id=$(message_get_id $file)
+ message_id=$(message_get_id $file)
- local commiter_email=$(git config --get user.email)
- local patch_from=$(grep "From:" "$file" | head -1)
- local sob
+ commiter_email=$(git config --get user.email)
+ patch_from=$(grep "From:" "$file" | head -1)
if [[ "$patch_from" != *"$commiter_email"* ]] ; then
sob=-s
fi
@@ -593,7 +607,9 @@ function dim_apply_next_fixes
function dim_cherry_pick
{
- local remote=`url_to_remote $drm_tip_ssh`
+ local remote sha sha_short
+
+ remote=`url_to_remote $drm_tip_ssh`
if [[ "x$1" = "x" ]]; then
echo "usage: $dim $subcommand commit-ish"
@@ -694,11 +710,13 @@ function dim_apply_igt
dim_alias_mp=magic-patch
function dim_magic_patch
{
+ local conflict_files
+
if [[ "$1" = "-a" ]]; then
cd `cat ~/.dim-last-path`
fi
- local conflict_files=`patch -p1 | grep "saving rejects" | sed -e "s/.*saving rejects to file \(.*\)/\1/"`
+ conflict_files=`patch -p1 | grep "saving rejects" | sed -e "s/.*saving rejects to file \(.*\)/\1/"`
if [[ $conflict_files != "" ]] ; then
echo conflicts found!
@@ -714,12 +732,14 @@ function dim_magic_patch
function dim_create_branch
{
+ local branch repo remote
+
if [[ "x$1" = "x" ]]; then
echo "usage: $dim $subcommand branch [commit-ish]"
exit 1
fi
- local branch=$1
- local repo="drm-intel"
+ branch=$1
+ repo="drm-intel"
if [[ "x$2" = "x" ]]; then
start=HEAD
@@ -734,7 +754,7 @@ function dim_create_branch
branch=${branch#*/}
fi
- local remote=`repo_to_remote $repo`
+ remote=`repo_to_remote $repo`
$DRY git branch $branch $start
git push $DRY_RUN $remote +$branch --set-upstream
@@ -748,11 +768,13 @@ function dim_create_branch
function dim_remove_branch
{
+ local branch repo remote
+
if [[ "x$1" = "x" ]]; then
echo "usage: $dim $subcommand branch"
exit 1
fi
- local branch=$1
+ branch=$1
cd $DIM_PREFIX/$DIM_DRM_INTEL
@@ -768,14 +790,14 @@ function dim_remove_branch
cd $DIM_PREFIX/drm-tip
- local repo=`branch_to_repo $branch`
+ repo=`branch_to_repo $branch`
if [[ $repo == "" ]] ; then
echoerr "$branch not found in $integration_config"
exit 1
fi
- local remote=`repo_to_remote $repo`
+ remote=`repo_to_remote $repo`
git push $DRY_RUN $remote --delete $branch
$DRY git fetch $remote --prune
@@ -803,15 +825,17 @@ function dim_cd
dim_alias_co=checkout
function dim_checkout
{
+ local branch repo remote
+
if [[ "x$1" = "x" ]]; then
echo "usage: $dim $subcommand branch"
exit 1
fi
- local branch=$1
+ branch=$1
dim_cd $branch
if [[ `git branch --list $branch` == "" ]] ; then
- local repo=`branch_to_repo $branch`
+ repo=`branch_to_repo $branch`
if [[ $branch == "drm-intel-next" ]] ; then
repo="drm-intel"
@@ -822,7 +846,7 @@ function dim_checkout
exit 1
fi
- local remote=`repo_to_remote $repo`
+ remote=`repo_to_remote $repo`
if [ "$remote" == "" ] ; then
exit 1
@@ -852,18 +876,24 @@ function dim_conf
# $1 is the git sha1 to check
function checkpatch_commit
{
- local commit=$1
- local cmd="git show --pretty=email $commit"
+ local commit cmd bug_lines non_i915_files
+
+ commit=$1
+ cmd="git show --pretty=email $commit"
git --no-pager log --oneline -1 $commit
$cmd | scripts/checkpatch.pl -q --emacs --strict - || true
+ # FIXME: this relies on local assignment not failing on command
+ # substitution failures
local bug_lines=$($cmd | grep -m 1 -B 1 '^\+.*\WBUG' | grep -c '^[+-].*\WBUG')
if test "$bug_lines" -eq 1; then
warn_or_fail "New BUG macro added"
fi
if [ "$branch" = "drm-intel-next-queued" ]; then
+ # FIXME: this relies on local assignment not failing on command
+ # substitution failures
local non_i915_files=$(git diff-tree --no-commit-id --name-only -r $commit | \
grep -v "^\(drivers/gpu/drm/i915/\|include/drm/i915\|include/uapi/drm/i915\)")
@@ -891,7 +921,9 @@ dim_alias_check_patch=checkpatch
dim_alias_cp=checkpatch
function dim_checkpatch
{
- local range=$(rangeish "$1")
+ local range
+
+ range=$(rangeish "$1")
for commit in $(git rev-list --reverse $range); do
checkpatch_commit $commit || true
@@ -900,7 +932,9 @@ function dim_checkpatch
function dim_sparse
{
- local range=$(rangeish "$1")
+ local range
+
+ range=$(rangeish "$1")
make $DIM_MAKE_OPTIONS
touch --no-create `git diff --name-only $range` `git diff --name-only`
@@ -943,11 +977,13 @@ function prep_pull_mail_signature
# without tags, print a reminder
function prep_pull_mail_overview
{
+ local obj
+
if [ "$#" = "0" ]; then
echo "*** insert pull request overview here ***"
else
for tag in $@ ; do
- local obj=`git rev-parse $tag`
+ obj=`git rev-parse $tag`
if [[ `git cat-file -t $obj` == "tag" ]] ; then
echo $tag:
git cat-file -p $obj | tail -n+6
@@ -967,9 +1003,10 @@ function prep_pull_mail
function dim_create_workdir
{
- cd $DIM_PREFIX
local branches
+ cd $DIM_PREFIX
+
if [[ "x$1" = "x" ]]; then
echo "usage: $dim $subcommand branch|all"
exit 1
@@ -1013,9 +1050,11 @@ function dim_for_each_workdirs
function dim_update_next
{
+ local remote
+
assert_branch drm-intel-next-queued
- local remote=`url_to_remote $drm_tip_ssh`
+ remote=`url_to_remote $drm_tip_ssh`
git pull --ff-only
@@ -1046,9 +1085,11 @@ function dim_update_next
function dim_update_next_continue
{
+ local remote
+
assert_branch drm-intel-next-queued
- local remote=`url_to_remote $drm_tip_ssh`
+ remote=`url_to_remote $drm_tip_ssh`
git push $DRY_RUN -f $DIM_DRM_INTEL_REMOTE drm-intel-next-queued:drm-intel-next
tag=drm-intel-next-$today
@@ -1107,14 +1148,16 @@ function dim_tag_next
# dim_pull_request branch upstream
function dim_pull_request
{
+ local branch upstream remote repo url git_url
+
if [[ "x$1" = "x" || "x$2" = "x" ]]; then
echo "usage: $dim $subcommand branch upstream"
exit 1
fi
- local branch=$1
- local upstream=$2
- local remote=`branch_to_remote $branch`
+ branch=$1
+ upstream=$2
+ remote=`branch_to_remote $branch`
if [ "$branch" != "drm-intel-next" ]; then
assert_branch $branch
@@ -1131,18 +1174,18 @@ function dim_pull_request
prep_pull_mail $drm_intel_next_tags
tag=`git describe --all --exact $branch@{upstream}`
- local repo="drm-intel"
+ repo="drm-intel"
else
tag=$branch-$today
$DRY git tag -f $tag $branch@{upstream}
$DRY git push -f $remote $tag
prep_pull_mail
- local repo=`branch_to_repo $branch`
+ repo=`branch_to_repo $branch`
fi
- local url=${drm_tip_repos[$repo]}
- local git_url=`echo $url | sed -e 's/git\./anongit./' -e 's/ssh:/git:/'`
+ url=${drm_tip_repos[$repo]}
+ git_url=`echo $url | sed -e 's/git\./anongit./' -e 's/ssh:/git:/'`
git request-pull $upstream $git_url $tag >> ~/tmp/dim-pull-request
$DRY $DIM_MUA -s "[PULL] $branch" \
@@ -1175,7 +1218,9 @@ function dim_pull_request_next_fixes
# Note: used by bash completion
function dim_list_upstreams
{
- local dim_drm_upstream_remote=`url_to_remote $drm_upstream_git`
+ local dim_drm_upstream_remote
+
+ dim_drm_upstream_remote=`url_to_remote $drm_upstream_git`
echo origin/master
echo $dim_drm_upstream_remote/drm-next
echo $dim_drm_upstream_remote/drm-fixes
@@ -1190,6 +1235,8 @@ function dim_list_branches
dim_alias_ub=update-branches
function dim_update_branches
{
+ local repo remote
+
cd $DIM_PREFIX/$DIM_DRM_INTEL
for remote in $DIM_DRM_INTEL_REMOTE `url_to_remote $drm_upstream_git` origin; do
git fetch -q $remote || true
@@ -1199,8 +1246,8 @@ function dim_update_branches
for branch in $dim_branches ; do
dim_checkout $branch
- local repo=`branch_to_repo $branch`
- local remote=`repo_to_remote $repo`
+ repo=`branch_to_repo $branch`
+ remote=`repo_to_remote $repo`
if git diff --quiet $remote/$branch; then
$DRY git rebase
@@ -1216,10 +1263,11 @@ function dim_update_branches
function setup_aux_checkout # name url directory
{
- local name=$1
- local url=$2
- local dir=$3
- local remote
+ local name url dir remote
+
+ name=$1
+ url=$2
+ dir=$3
echo "Setting up $dir ..."
@@ -1299,7 +1347,9 @@ function dim_setup
function assert_branch
{
- local branch=$1
+ local branch
+
+ branch=$1
dim_cd $branch
@@ -1341,12 +1391,14 @@ function dim_cat_to_fixup
function dim_tc
{
+ local tag dim_drm_upstream_remote
+
cd $DIM_PREFIX/$DIM_DRM_INTEL
- local tag=$(git tag --contains $1 | grep ^v | sort -V | head -n 1)
+ tag=$(git tag --contains $1 | grep ^v | sort -V | head -n 1)
if [[ -n "$tag" ]]; then
echo "$tag"
else
- local dim_drm_upstream_remote=`url_to_remote $drm_upstream_git`
+ dim_drm_upstream_remote=`url_to_remote $drm_upstream_git`
# not in a tagged release, show upstream branches
git branch -r --contains $1 \
$DIM_DRM_INTEL_REMOTE/* \
@@ -1358,7 +1410,9 @@ function dim_tc
function dim_cite
{
- local sha1=$1
+ local sha1
+
+ sha1=$1
cd $DIM_PREFIX/$DIM_DRM_INTEL
git log -1 $sha1 "--pretty=format:%H (\"%s\")%n" | \
@@ -1367,8 +1421,10 @@ function dim_cite
function dim_fixes
{
+ local sha1 tag
+
cd $DIM_PREFIX/$DIM_DRM_INTEL
- local sha1=$1
+ sha1=$1
echo "Fixes: $(dim_cite $sha1)"
@@ -1379,7 +1435,7 @@ function dim_fixes
git show $sha1 | scripts/get_maintainer.pl --email --norolestats --pattern-depth 1 | sed -e "s/^/Cc: /"
) | awk '!x[$0]++'
- local tag=$(git tag --contains $1 | grep ^v | sort -V | head -n 1)
+ tag=$(git tag --contains $1 | grep ^v | sort -V | head -n 1)
if [[ -n "$tag" ]]; then
if echo "$tag" | grep -q -e "-rc" ; then
echo "Cc: <drm-intel-fixes at lists.freedesktop.org> # ${tag}+"
--
2.1.4
More information about the Intel-gfx
mailing list