You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2016/02/08 12:07:44 UTC

[04/11] brooklyn-dist git commit: add some new scripts (which i find useful)

add some new scripts (which i find useful)


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-dist/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-dist/commit/43faec6b
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-dist/tree/43faec6b
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-dist/diff/43faec6b

Branch: refs/heads/master
Commit: 43faec6b9e5143e3e9e052e0060a61ac87001ef1
Parents: 3fb5160
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Wed Feb 3 10:34:05 2016 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Feb 3 10:37:42 2016 +0000

----------------------------------------------------------------------
 scripts/README.md        |   5 ++
 scripts/git-summary.sh   | 134 ++++++++++++++++++++++++++++++++++++++++++
 scripts/jstack-active.sh |  78 ++++++++++++++++++++++++
 scripts/mvnf.sh          |  80 +++++++++++++++++++++++++
 scripts/rsd.sh           |  35 +++++++++++
 5 files changed, 332 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-dist/blob/43faec6b/scripts/README.md
----------------------------------------------------------------------
diff --git a/scripts/README.md b/scripts/README.md
index 2852b1c..9a404ff 100644
--- a/scripts/README.md
+++ b/scripts/README.md
@@ -5,3 +5,8 @@ This folder contains a number of items that can assist developers of the project
 
 In general see comments at the start of each file and/or `--help` output when running it.
 
+You can install the `*.sh` files as commands (without the `.sh` suffix linked to these) to your `bin` dir with:
+
+    for x in *.sh ; do sudo ln -s `pwd`/$x /usr/local/bin/${x%.sh}; done
+
+

http://git-wip-us.apache.org/repos/asf/brooklyn-dist/blob/43faec6b/scripts/git-summary.sh
----------------------------------------------------------------------
diff --git a/scripts/git-summary.sh b/scripts/git-summary.sh
new file mode 100755
index 0000000..79bde93
--- /dev/null
+++ b/scripts/git-summary.sh
@@ -0,0 +1,134 @@
+#!/bin/bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+# displays a summary list of commits in your current repo vs upstream branch and upstream master,
+# and of working tree changes Added, Modified, Deleted, or not in index ("??")
+
+THIS_COMMAND="$0 $@"
+
+while true; do
+  case $1 in
+    -o|--offline)
+      OFFLINE=true
+      ;;
+    -r|--recurse|--recursive)
+      RECURSE=true
+      ;;
+    -m|--master)
+      shift
+      UPSTREAM_MASTER=$1
+      MASTER_UPSTREAM_REPO=`echo $1 | cut -d / -f 1`
+      ;;
+    -h|--help)
+      cat <<EOF
+Usage: git-summary [--help] [-o|--offline] [-r|--recursive] [-m|--master REPO/BRANCH] [<path>]"
+
+This will display a one-line git log for differences between the local branch, the upstream 
+repo and branch of the local branch, and the upstream/master or origin/master branch.  
+
+The following prefixes are shown on commits:
+
+  < means in upstream/master but not in your upstream branch (your upstream is behind master)
+  > means in your upstream branch but not in upstream/master (your upstream is ahead of master)
+  ^ means in your upstream branch but not locally (consider a pull)
+  * means local but not in the upstream branch (consider a push)
+
+The optional <path> one or more files or paths to look at.
+
+The following options are supported:
+
+  -o  to operate offline, skipping the fetch done by default (aka --offline)
+  -r  to recurse (aka --recurs{e,ive})
+  -m  to specify a master "repo/branch" to compare upstream with, or "" for none (aka --master);
+      defaults to "upstream/master" or "origin/master" (the first existing)
+ 
+
+EOF
+      exit 1
+      ;;
+    *)
+      break
+      ;;
+    esac
+    shift || break
+done
+
+# assume master is upstream/master or origin/master
+[ -n "${MASTER_UPSTREAM_REPO}" ] || \
+  MASTER_UPSTREAM_REPO=upstream && git config remote.${MASTER_UPSTREAM_REPO}.url > /dev/null || \
+  MASTER_UPSTREAM_REPO=origin && git config remote.${MASTER_UPSTREAM_REPO}.url > /dev/null || \
+  unset MASTER_UPSTREAM_REPO
+[ -z "${MASTER_UPSTREAM_REPO}" ] || \
+  [ -n "${UPSTREAM_MASTER}" ] || UPSTREAM_MASTER=${MASTER_UPSTREAM_REPO}/master
+[ -z "${MASTER_UPSTREAM_REPO}" ] || [ -n "${OFFLINE}" ] || \
+  git fetch ${MASTER_UPSTREAM_REPO}
+
+THIS_BRANCH_NAME=$(git symbolic-ref --short -q HEAD)
+if [ -z "${THIS_BRANCH_NAME}" ] ; then
+  THIS_BRANCH_NAME="(DETACHED)"
+  unset THIS_UPSTREAM_BRANCH
+else
+  THIS_UPSTREAM_BRANCH=$(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD))
+  THIS_UPSTREAM_BRANCH_REPO=$(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD) | cut -f 1 -d '/')
+  # fetch the branch's upstream repo if different to the master
+  [ -n "${OFFLINE}" ] || [ -z "${THIS_UPSTREAM_BRANCH_REPO}" ] || [ "${THIS_UPSTREAM_BRANCH_REPO}" == "${MASTER_UPSTREAM_REPO}" ] || git fetch ${THIS_UPSTREAM_BRANCH_REPO}
+fi
+[ \! -z "${THIS_UPSTREAM_BRANCH}" ] && THIS_UPSTREAM_BRANCH_NAME="${THIS_UPSTREAM_BRANCH}" || THIS_UPSTREAM_BRANCH_NAME="(no upstream)"
+
+TMP=/tmp/git-summary-$(uuidgen)
+rm -f ${TMP}-*
+touch ${TMP}-{1-master-ahead,2-master-behind,3-up,4-local}
+
+if [ -z "${UPSTREAM_MASTER}" -a -z "$THIS_UPSTREAM_BRANCH" ] ; then
+  true # nothing to do
+elif [ "${UPSTREAM_MASTER}" == "$THIS_UPSTREAM_BRANCH" -o -z "$THIS_UPSTREAM_BRANCH" ] ; then
+  [ -z "${UPSTREAM_MASTER}" ] || git log --pretty=" ^ %h %aN, %ar: %s" ..${UPSTREAM_MASTER} "$@" > ${TMP}-3-up
+  [ -z "${UPSTREAM_MASTER}" ] || git log --pretty=" * %h %aN, %ar: %s" ${UPSTREAM_MASTER}.. "$@" > ${TMP}-4-local
+else
+  [ -z "${UPSTREAM_MASTER}" ] || git log --pretty=" < %h %aN, %ar: %s" $THIS_UPSTREAM_BRANCH..${UPSTREAM_MASTER} "$@" > ${TMP}-1-master-ahead
+  [ -z "${UPSTREAM_MASTER}" ] || git log --pretty=" > %h %aN, %ar: %s" ${UPSTREAM_MASTER}..$THIS_UPSTREAM_BRANCH "$@" > ${TMP}-2-master-behind
+  git log --pretty=" ^ %h %aN, %ar: %s" ..$THIS_UPSTREAM_BRANCH "$@" > ${TMP}-3-up
+  git log --pretty=" * %h %aN, %ar: %s" $THIS_UPSTREAM_BRANCH.. "$@" > ${TMP}-4-local
+fi
+git status --porcelain --ignore-submodules "$@" > ${TMP}-5-commits
+cat ${TMP}-* > ${TMP}
+if [ -s ${TMP} ] ; then
+  AHEAD=$(wc ${TMP}-1-* | awk '{print $1}')
+  BEHIND=$(wc ${TMP}-2-* | awk '{print $1}')
+  UP=$(wc ${TMP}-3-* | awk '{print $1}')
+  LOCAL=$(wc ${TMP}-4-* | awk '{print $1}')
+  [ "${AHEAD}" == "0" ] || COUNTS="upstream ${AHEAD} behind master"
+  [ "${BEHIND}" == "0" ] || COUNTS="${COUNTS}${COUNTS:+, }upstream ${BEHIND} ahead of master"
+  [ "${UP}" == "0" ] || COUNTS="${COUNTS}${COUNTS:+, }local ${UP} behind"
+  [ "${LOCAL}" == "0" ] || COUNTS="${COUNTS}${COUNTS:+, }local ${LOCAL} unpushed"
+  echo $(basename $(pwd))": ${THIS_BRANCH_NAME} <- ${THIS_UPSTREAM_BRANCH_NAME} (${COUNTS:-uncommitted changes only})"
+  cat ${TMP} | sed 's/^/ /'
+else
+  echo $(basename $(pwd))": ${THIS_BRANCH_NAME} <- ${THIS_UPSTREAM_BRANCH_NAME} (up to date)"
+fi
+rm -f ${TMP} ${TMP}-*
+
+# submodules ignored; if using them, set up
+
+if [ "$RECURSE" ] ; then
+  echo
+  git submodule --quiet foreach --recursive "${THIS_COMMAND}"
+fi
+

http://git-wip-us.apache.org/repos/asf/brooklyn-dist/blob/43faec6b/scripts/jstack-active.sh
----------------------------------------------------------------------
diff --git a/scripts/jstack-active.sh b/scripts/jstack-active.sh
new file mode 100755
index 0000000..16646b4
--- /dev/null
+++ b/scripts/jstack-active.sh
@@ -0,0 +1,78 @@
+#!/bin/bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+# displays a jstack thread dump showing only "really-running" threads
+#
+# takes a PID as argument
+# filters jstack to remove wait/blocked threads and known
+# wait points which report themselves as active (e.g. socket.read)
+#
+# very useful for spot-checking what is *actually* consuming CPU
+
+
+jstack $@ | awk '
+function onTraceBegin() {
+	onTraceEnd()
+	data["lineCount"]=0
+	data["head"]=$0
+}
+
+function onTraceEnd() {
+	if ("head" in data) {
+		if (data["active"] && "topClass" in data) {
+			print data["head"]
+			for (l=1; l<=data["lineCount"]; l++) { print lines[l] }
+			print ""
+		}
+	}
+	delete lines
+	delete data
+}
+
+function startsWith(whole,prefix) {
+	return (substr(whole,1,length(prefix))==prefix);
+}
+
+{
+  if (!match($0,"[^\\s]")) onTraceEnd();
+  else if (substr($0,1,1)=="\"") onTraceBegin();
+  else if ("head" in data) {
+	lc = ++data["lineCount"];
+	lines[lc]=$0
+	if (lc==1) {
+		state=data["state"]=$2;
+		data["active"] = !(state=="WAITING" || state=="BLOCKED" || state=="TIMED_WAITING")
+	}
+	if ($1=="at") {
+		if ("topClass" in data) {
+		} else {
+			data["topClass"] = $0;
+			tc = $2;
+			if (data["active"]) {
+				if (startsWith(tc,"java.net") || startsWith(tc,"sun.nio")) data["active"]=false;
+			}
+		}
+	}
+  }
+}
+END {
+	onTraceEnd();
+}
+'

http://git-wip-us.apache.org/repos/asf/brooklyn-dist/blob/43faec6b/scripts/mvnf.sh
----------------------------------------------------------------------
diff --git a/scripts/mvnf.sh b/scripts/mvnf.sh
new file mode 100755
index 0000000..bcd95cf
--- /dev/null
+++ b/scripts/mvnf.sh
@@ -0,0 +1,80 @@
+#!/bin/bash
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+# runs mvn fast in several dirs; run with `-h` for more info
+
+
+export DIRS=""
+export ARGS="-o clean install -DskipTests"
+if [[ -z $1 || $1 = "-h" || $1 == "--help" ]] ; then
+  echo
+  echo "MVNF: a simple script for building multiple maven directories"
+  echo
+  echo "usage:  mvnf [ -x \"install -Dxxx\" ] dir1 [ dir2 [ ... ]]"
+  echo
+  echo "This will do a maven build in each directory specified, in order, "
+  echo "giving arguments '-o clean install -DskipTests' to mvn by default "
+  echo "or other arguments if supplied in the word following -x at start. "
+  echo "The script aborts if any build fails, giving the last return code "
+  echo "code, and returning to the directory where it was invoked."
+  echo
+  echo "eg: \`mvnf ../other . && ./target/dist/run.sh\`"
+  echo "    will build other, then build ., then run a just-build script "
+  echo "    if all went well (but if it fails you'll see that too)"
+  echo
+  if [ -z $1 ] ; then exit 1 ; fi
+  exit 0
+fi
+if [ $1 = "-x" ] ; then
+  shift
+  export ARGS=$1
+  shift
+fi
+echo "MVNF: running \`mvn $ARGS\` on: $@"
+for x in $@
+do
+  if [ ! -d $x ] ; then
+    export RETVAL=1
+    echo "MVNF: no such directory $x"
+    break
+  fi
+  if [ ! -f $x/pom.xml ] ; then
+    export RETVAL=1
+    echo "MVNF: no pom available in $x"
+    break
+  fi
+  pushd $x > /dev/null
+  export DIR=`basename \`pwd\``
+  echo "MVNF: building $DIR (${x})"
+  mvn $ARGS
+  export RETVAL=$?
+  export DIRS="${DIRS}${DIR} "
+  echo
+  popd > /dev/null
+  if [ $RETVAL != 0 ] ; then 
+    echo "MVNF: mvn failed in directory $DIR (${x})"
+    break
+  fi
+done
+if [ $RETVAL = 0 ] ; then
+  echo MVNF: successfully built $DIRS
+fi
+test ${RETVAL} = 0

http://git-wip-us.apache.org/repos/asf/brooklyn-dist/blob/43faec6b/scripts/rsd.sh
----------------------------------------------------------------------
diff --git a/scripts/rsd.sh b/scripts/rsd.sh
new file mode 100755
index 0000000..effb5e4
--- /dev/null
+++ b/scripts/rsd.sh
@@ -0,0 +1,35 @@
+#!/bin/bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+# executes the command supplied as an argument in a tmp directory rsynched against the current directory
+# the tmp is a hash of `pwd` so the target will be the same on multiple runs
+# esp useful when running something like `rsd mvn clean install` 
+# but you don't want your IDE or other changes to interfere
+
+ORIG=`pwd`
+DIR=`basename $(pwd -P)`-`pwd | md5sum | awk '{print $1}'`
+mkdir -p /tmp/$DIR/
+pushd /tmp/$DIR/ > /dev/null
+echo executing \'$@\' in `pwd` as a copy of $ORIG 
+rsync -a --delete $ORIG/ .
+"$@"
+# not necessary as command invoked in subshell
+# popd > /dev/null
+