releases/tools/series_diff_start.sh
Doug Hellmann 9ecc088e06 ignore empty files when looking for unchanged files
Change-Id: Iddc83ff475762dba885db03734933276498f7c5b
Signed-off-by: Doug Hellmann <doug@doughellmann.com>
2018-05-04 14:44:47 -04:00

137 lines
3.2 KiB
Bash
Executable File

#!/bin/bash
#
# All Rights Reserved.
#
# Licensed 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.
#
# This script shows the basic stats of changes in git repositories
# between the two series given as the first argument.
if [[ ! -d .tox/venv ]]; then
tox -e venv --notest
fi
source .tox/venv/bin/activate
bindir="$(dirname $0)"
source "$bindir/functions"
setup_temp_space
START="$1"
shift
END="$1"
shift
REPOS="$@"
function get_branch_end() {
local branch="$1"
if git tag | grep -q ${branch}-eol; then
# This branch is closed, use the EOL tag as the start
echo "${branch}-eol"
else
echo "origin/stable/$branch"
fi
}
function get_branch_base() {
local branch="$1"
local scan_start="$(get_branch_end $branch)"
git log --decorate --oneline ..${scan_start} \
| grep tag: \
| tail -n 1 \
| cut -f2 -d: \
| cut -f1 -d')'
}
function count_lines() {
git ls-files | xargs wc -l | tail -n 1 | awk '{print $1}'
}
function count_files() {
git ls-files | wc -l
}
function git_ls_tree() {
local tag="$1"
local extension="$2"
if [ -z "$extension" ]; then
git ls-tree -lr $tag
else
git ls-tree -lr $tag | grep ${extension}'$'
fi
}
function shas_at_tag() {
# Produce a list of shas used by objects representing files with
# real content at the tag point
local tag="$1"
local extension="$2"
local mode
local type
local sha
local size
local filename
git_ls_tree $tag $extension | while read mode type sha size filename; do
if [ "$size" != "0" ]; then
echo $sha
fi
done
}
function count_unchanged_files() {
local start="$1"
local end="$2"
local extension="$3"
comm -12 <( shas_at_tag $start "$extension" | sort ) \
<( shas_at_tag $end "$extension" | sort ) \
| wc -l
}
for repo in $REPOS; do
clone_repo $repo
cd $repo
# Find when the start branch was created
base=$(echo $(get_branch_base $START)) # echo strips leading spaces
# Compute the most recent tagged version on the ending series.
latest=$(git describe --abbrev=0 $(get_branch_end $END))
title "$repo $base .. $latest"
echo
git checkout $base 2>/dev/null
echo $base lines: $(count_lines)
echo $base files: $(count_files)
echo
git checkout $latest 2>/dev/null
echo $latest lines: $(count_lines)
echo $latest files: $(count_files)
echo
git diff --stat ${base}..${latest} | tail -n 1
echo
echo "Unchanged files: $(count_unchanged_files $base $latest)"
echo "Unchanged .py files: $(count_unchanged_files $base $latest .py)"
echo
cd $MYTMPDIR
done