「利用者:Nazg-gul/DevTools」の版間の差分
(→Show branch in bash prompt) |
細 (1版 をインポートしました) |
(相違点なし)
|
2018年6月29日 (金) 04:46時点における最新版
目次
Developer Tools
Here's some developer tools used by me. Some of them are ported from here to fork with Git.
bachangelog-generator
Here's a script I'm using to help generating bug fixes section of release logs.
#!/bin/bash
#echo -n "From revision: "
#read revision_from
revision_from=56521
#echo -n "Up to revision: "
#read revision_to
revision_to=56521
for r in `seq "${revision_from}" "${revision_to}"`; do
h=`git svn find-rev "r${r}"`
if [ -z "${h}" ]; then
# commit was done to another branch
continue
fi
msg=`git log --pretty="%s%n%n%b" "${h}^".."${h}" | grep -v "git-svn-id"`
# Skip svn maintaince commits
maint=`echo "${msg}" | grep -i "SVN maintenance"`
if [ ! -z "${maint}" ]; then
continue
fi
# Skip style and code cleanup commits
cleanup=`echo "${msg}" | grep -i "^style cleanup"`
if [ ! -z "${cleanup}" ]; then
continue
fi
cleanup=`echo "${msg}" | grep -i "^code cleanup"`
if [ ! -z "${cleanup}" ]; then
continue
fi
git log --pretty="-- {{Commit|${r}}} by %an ----------------%n" "${h}^".."${h}"
# todo:
# - skip "committed by accident"
# - support "Bugfix for"
fix=`echo "${msg}" | grep -Ei "fix( for| bug|ed|es bug|es )?:?\s+\[?#[0-9]+\]?"`
if [ ! -z "${fix}" ]; then
bug=`echo "${fix}" | sed -r 's/.*#([0-9]+).*/\1/'`
title=`echo "${fix}" | sed -r 's/.*fix( for| bug|ed|es bug)?:?\s+\[?#[0-9]+\]?:?\s*//i'`
echo "Fix {{BugReport|$bug}}: ${title} ({{Commit|$r}})"
echo
fi
echo "${msg}"
echo
echo
done
It could be optimized further, like ignoring style/code cleanup commits, but it's already helps a lot.
bcheck
Script makes basic check for code style and it checks only lines being changed in current patch.
#!/bin/bash
DIFF=`mktemp`
git diff-index -p -M HEAD -- > $DIFF
Lines=`wc -l < $DIFF`
count=0
while [ $count -lt $Lines ]
do
count=$(($count+1))
LINE=`head -n $count $DIFF | tail -1`
if echo "$LINE" | grep -cqP '^diff --git a/.* b/(.*)$'; then
filename=`echo "$LINE" | sed -r 's/^diff --git a\/.* b\/(.*)$/\1/'`
continue
fi
if echo "$LINE" | grep -cqP '^@@ -\S+ \+(\d+)'; then
lineno=`echo "$LINE" | sed -r 's/^@@ -\S+ \+([0-9]+).*/\1/'`
continue
fi
if echo "$LINE" | grep -cqP '^ '; then
lineno=$(($lineno+1))
continue
fi
if echo "$LINE" | grep -cqP '^\+'; then
newline=`echo "$LINE" | sed -r 's/^\+//'`
if echo "$newline" | grep -cqP '\s$'; then
echo "$filename:$lineno: Trailing whitespace"
fi
if echo "$newline" | grep -cqP '^[<>=]{7}'; then
echo "$filename:$lineno: Unresolved merge conflict"
fi
if echo "$filename" | grep -cqP '\.py$'; then
if echo "$newline" | grep -cqP '^ *\t'; then
echo "$filename:$lineno: TAB used for indentation"
fi
else
if echo "$newline" | grep -cqP '^\t* '; then
if echo "$newline" | grep -cqP '^ {1,2}'; then
# do nothing -- most probably indentation for comment
echo "" > /dev/null
else
echo "$filename:$lineno: SPACE used for indentation"
fi
fi
fi
lineno=$(($lineno+1))
fi
done
rm $DIFF
bcheck-files
This script checks style in all currently changed files and would report all issues met in that files.
#!/bin/bash
d=$PWD
# get root directory of a repository
root=`git rev-parse --show-toplevel 2>/dev/null`
if [[ -z "$root" ]]; then
root=`pwd`
while [[ -d "`dirname $parent`/.svn" ]]; do
root=`dirname $parent`
done
fi
cd $root
# TODO: port to svn too
for f in `git diff --name-only -r HEAD`; do
python3.2 $root/source/tools/check_style_c.py $f
done
cd $d
bpropcheck
This script checks SVN properties assigned to source files and prints files and properties which are missing.
#!/bin/sh
for f in `find . -type f`; do
if echo "$f" | grep -cqP '\.[cpp|c|cc|h|hpp|cxx|py]$'; then
# Checking source file
keywords=`svn propget svn:keywords ${f}`
eolstyle=`svn propget svn:eol-style ${f}`
if [ -z "$keywords" ]; then
echo "$f: missing property svn:keywords"
else
echo "Author\nDate\nId\nRevision" | while read x; do
if ! echo "$keywords" | grep -cqP "$x"; then
echo "$f: missing svn:keyword '$x'"
fi
done
fi
if [ -z "$eolstyle" ]; then
echo "$f: missing property svn:eol-style"
else
if [ "$eolstyle" != "native" ]; then
echo "$f: svn:eol-style expected 'native' but '$eolstyle' found"
fi
fi
fi
done
bsrcprop
This script resets required SVN properties for list of source files.
#!/bin/sh
for x in $@; do
svn propset svn:keywords 'Author Date Id Revision' $x
svn propset svn:eol-style native $x
done
bsymlink-cycles
I've got WITH_PYTHON_INSTALL disabled in my CMake configuration which makes it a bit difficult to check issues appearing in Cycles.
Here's a small utility script which allows to use Cycles with all the features like GPU rendering and OpenShadingLanguage. It basically initializes Cycle addon's directory structure with a symbolic links to source tree and compiler OSL shaders.
Simply running it from ~/.config/blender/2.69/scripts/addons/cycles will do all the job done and you'll be ready to use Cycles (tweak blender version in the path if needed)
#!/bin/bash
SOURCE_TREE="$HOME/src/blender/blender/"
BUILD_DIR="$HOME/src/blender/build/cmake-debug/"
ADDON_PATH=$PWD
if [ $# -ne 0 ]; then
echo "Usage: $0"
exit 1
fi
echo "Clear previous symbolic links..."
for file_path in "$ADDON_PATH"/* "$ADDON_PATH"/kernel/* "$ADDON_PATH"/shader/*; do
file_name=`basename $file_path`
if [ "$file_name" == "init.sh" ]; then
continue
elif [ -h "$file_path" ]; then
echo " Unlinking $file_path"
unlink $file_path
fi
done
echo "Creating symbolic links for addon..."
for file_path in "$SOURCE_TREE"/intern/cycles/blender/addon/*; do
file_name=`basename $file_path`
if [ "$file_name" == "__pycache__" ]; then
continue
fi
echo " Linking to $file_name"
ln -s "$file_path" "$ADDON_PATH/$file_name"
done
echo "Creating symbolic links for kernel..."
mkdir -p "$ADDON_PATH"/kernel
for file_path in "$SOURCE_TREE"/intern/cycles/kernel/*; do
file_name=`basename $file_path`
if [ "$file_name" == "shaders" ]; then
continue
fi
echo " Linking to $file_name"
ln -s "$file_path" "$ADDON_PATH/kernel/$file_name"
done
echo "Creating symbolic links for OSL shaders..."
mkdir -p "$ADDON_PATH"/shader
# TODO(sergey): Sypport SCons
if [ -f "$BUILD_DIR"/CMakeCache.txt ]; then
for file_path in "$BUILD_DIR"/intern/cycles/kernel/osl/nodes/*; do
file_name=`basename $file_path`
file_extension="${file_name##*.}"
if [ "$file_extension" == "oso" ]; then
echo " Linking to $file_name"
ln -s "$file_path" "$ADDON_PATH/shader/$file_name"
fi
done
fi
echo "Creating symbolic links to utility headers..."
for header in util_color.h util_math.h util_transform.h util_types.h; do
echo " Linking to $header"
ln -s "$SOURCE_TREE/intern/cycles/util/$header" "$ADDON_PATH/kernel/$header"
done
for file_path in "$SOURCE_TREE"/intern/cycles/kernel/shaders/*; do
file_name=`basename $file_path`
file_extension="${file_name##*.}"
if [ "$file_extension" == "h" ]; then
echo " Linking to $file_name"
ln -s "$file_path" "$ADDON_PATH/shader/$file_name"
fi
done
svn-diff
Script creates svn-compatible patch for changes made in git-svn repo. Ininitally it was found in yandex or Git mailing list, not sure..
#!/bin/bash
# Generate an SVN-compatible diff against the tip of the tracking branch
TRACKING_BRANCH=`git config --get svn-remote.svn.fetch | sed -e 's/.*:refs\/remotes\///'`
REV=`git svn find-rev $(git rev-list --date-order --max-count=1 $TRACKING_BRANCH)`
git diff --no-prefix $(git rev-list --date-order --max-count=1 $TRACKING_BRANCH) $* |
sed -e "s/^+++ .*/&\t(working copy)/" -e "s/^--- .*/&\t(revision $REV)/" \
-e "s/^diff --git [^[:space:]]*/Index:/" \
-e "s/^index.*/===================================================================/" \
-r -e "s/^(@@ \-[0-9]+,[0-9]+ \+[0-9]+,[0-9]+ @@).*/\1/" |
sed -r -e 'N;N; s/\n---\s\/dev\/null\s\(revision [0-9]+\)\n\+\+\+ (.*)?\s\(working copy\)/\n--- \1\t(revision 0)\n+++ \1\t(revision 0)/' \
-e 's/\nnew file mode [0-9]+//' \
-e 's/\ndeleted file mode [0-9]+//' \
-e 'N;N; s/\n\-\-\- (.*)?\s\(revision ([0-9]+)\)\n\+\+\+\s\/dev\/null\s\(working copy\)/\n--- \1\t(revision \2)\n+++ \1\t(working copy)/'
touchdiff
Ported from script by Campbell Barton: Sometimes you want to know if any of the files you edited caused errors. Rebuilds you may have missed some so touching all modified files, then rebuilding is useful for this.
Add this to your ~/.bashrc file.
alias touchdiff='git status > /dev/null 2>&1 && touch `git diff --name-only -r HEAD --relative .` || touch `svn st | grep "^M" | cut -f4-8 -d" "`'
Show branch in bash prompt
Adding this to ~/.bashrc will make it so command prompt contains name of current branch in git repository.
Black='\[\033[00;30m\]';
Blue='\[\033[00;34m\]';
Green='\[\033[00;32m\]';
Cyan='\[\033[00;36m\]';
Red='\[\033[00;31m\]';
Purple='\[\033[00;35m\]';
Brown='\[\033[00;33m\]';
LGray='\[\033[00;37m\]';
DGray='\[\033[01;30m\]';
LBlue='\[\033[01;34m\]';
LGreen='\[\033[01;32m\]';
LCyan='\[\033[01;36m\]';
LRed='\[\033[01;31m\]';
LPurple='\[\033[01;35m\]';
Yellow='\[\033[01;33m\]';
White='\[\033[01;37m\]';
Normal='\[\033[00m\]';
__bashrc_git_ps1()
{
if git rev-parse --git-dir > /dev/null 2>&1; then
#local b="$(git symbolic-ref HEAD 2>/dev/null)";
git_dir=`git rev-parse --git-dir`
if [ "`basename \"$git_dir\"`" == '.git' ]; then
GIT="git -C ${git_dir}/.."
else
GIT="git"
fi
local b="$($GIT branch | sed -n '/\* /s///p' 2>/dev/null)";
if [ -n "$b" ]; then
local status=""
local changed_files="$($GIT diff-index --name-only HEAD -- | wc -l)"
local new_commits="$($GIT log --oneline @{u}.. 2>/dev/null | wc -l)"
if [ ! "$new_commits" -eq "0" ]; then
status="$status($new_commits)"
fi
if [ ! "$changed_files" -eq "0" ]; then
status="$status[M]"
fi
if [ ! -z "$status" ]; then
status=" $status"
fi
printf " (${b##refs/heads/}${status})";
fi
fi
}
PS1='${debian_chroot:+($debian_chroot)}'"${Green}\u${Normal}@${Yellow}\h${Normal}:${LBlue}\w${Green}"'$(__bashrc_git_ps1)'"${Normal}\$ "
Git hooks
pre-commit
Disallows git commit when there're staged changes to the submodules hash.
#!/bin/sh
ROOT=`git rev-parse --show-toplevel`
SUBMODULES=`grep path ${ROOT}/.gitmodules | sed 's/.*= //'`
have_changed_submodules=false
for submodule in $SUBMODULES; do
status=`git diff --ignore-submodules=none --cached --name-only $ROOT/$submodule`
if [ ! -z ${status} ]; then
echo "Changed and staged submodule: $submodule"
have_changed_submodules=true
fi
done
if $have_changed_submodules; then
echo ""
echo "Some of the submodules are changed. This should not normally happen."
if [ -z ${FORCE_SUBMODULES} ]; then
echo ""
echo "If you REALLY need to commit changes to submodule, use FORCE_SUBMODULES"
echo "environment variable like this:"
echo ""
echo " FORCE_SUBMODULES=1 git commit"
exit 1
else
echo "Commit of staged submodules was forced."
fi
fi
If you actually need to commit changes to hash use:
FORCE_SUBMODULES=1 git commit
prepare-commit-msg
Put information about submodules changes to be added to the commit.
#!/bin/sh
ROOT=`git rev-parse --show-toplevel`
SUBMODULES=`grep path ${ROOT}/.gitmodules | sed 's/.*= //'`
first_time=true
for submodule in $SUBMODULES; do
status=`git diff --ignore-submodules=none --cached --name-only $ROOT/$submodule`
if [ ! -z ${status} ]; then
if $first_time; then
echo "# Submodules to be committed:" >> $1
fi
echo "#\tmodified: $submodule" >> $1
first_time=false
fi
done