diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2016-02-03 10:24:26 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2016-02-04 08:40:35 +0100 |
commit | d597afe7fbb0ac8ed0bcc48a5a73ca0ff62e7e63 (patch) | |
tree | d506afe0865a0bd5cc380e6bf751b38db77841b3 /dts/scripts | |
parent | 73b35531b70acd011a2b9e0558689d15e5ada781 (diff) | |
download | barebox-d597afe7fbb0ac8ed0bcc48a5a73ca0ff62e7e63.tar.gz barebox-d597afe7fbb0ac8ed0bcc48a5a73ca0ff62e7e63.tar.xz |
dts: update to v4.4-rc5
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'dts/scripts')
-rw-r--r-- | dts/scripts/Kbuild.include | 278 | ||||
-rwxr-xr-x | dts/scripts/basic/fixdep | 27 | ||||
-rwxr-xr-x | dts/scripts/cronjob | 115 | ||||
-rwxr-xr-x | dts/scripts/filter.sh | 37 | ||||
-rwxr-xr-x | dts/scripts/flatten-symlinks.sh | 31 | ||||
-rwxr-xr-x | dts/scripts/git-filter-branch | 557 | ||||
-rwxr-xr-x | dts/scripts/index-filter.sh | 18 | ||||
-rwxr-xr-x | dts/scripts/merge-new-release.sh | 22 | ||||
-rw-r--r-- | dts/scripts/rewrite-paths.sed | 38 |
9 files changed, 1123 insertions, 0 deletions
diff --git a/dts/scripts/Kbuild.include b/dts/scripts/Kbuild.include new file mode 100644 index 0000000000..978416dd31 --- /dev/null +++ b/dts/scripts/Kbuild.include @@ -0,0 +1,278 @@ +#### +# kbuild: Generic definitions + +# Convenient variables +comma := , +squote := ' +empty := +space := $(empty) $(empty) + +### +# Name of target with a '.' as filename prefix. foo/bar.o => foo/.bar.o +dot-target = $(dir $@).$(notdir $@) + +### +# The temporary file to save gcc -MD generated dependencies must not +# contain a comma +depfile = $(subst $(comma),_,$(dot-target).d) + +### +# filename of target with directory and extension stripped +basetarget = $(basename $(notdir $@)) + +### +# filename of first prerequisite with directory and extension stripped +baseprereq = $(basename $(notdir $<)) + +### +# Escape single quote for use in echo statements +escsq = $(subst $(squote),'\$(squote)',$1) + +### +# Easy method for doing a status message + kecho := : + quiet_kecho := echo +silent_kecho := : +kecho := $($(quiet)kecho) + +### +# filechk is used to check if the content of a generated file is updated. +# Sample usage: +# define filechk_sample +# echo $KERNELRELEASE +# endef +# version.h : Makefile +# $(call filechk,sample) +# The rule defined shall write to stdout the content of the new file. +# The existing file will be compared with the new one. +# - If no file exist it is created +# - If the content differ the new file is used +# - If they are equal no change, and no timestamp update +# - stdin is piped in from the first prerequisite ($<) so one has +# to specify a valid file as first prerequisite (often the kbuild file) +define filechk + $(Q)set -e; \ + $(kecho) ' CHK $@'; \ + mkdir -p $(dir $@); \ + $(filechk_$(1)) < $< > $@.tmp; \ + if [ -r $@ ] && cmp -s $@ $@.tmp; then \ + rm -f $@.tmp; \ + else \ + $(kecho) ' UPD $@'; \ + mv -f $@.tmp $@; \ + fi +endef + +###### +# gcc support functions +# See documentation in Documentation/kbuild/makefiles.txt + +# cc-cross-prefix +# Usage: CROSS_COMPILE := $(call cc-cross-prefix, m68k-linux-gnu- m68k-linux-) +# Return first prefix where a prefix$(CC) is found in PATH. +# If no $(CC) found in PATH with listed prefixes return nothing +cc-cross-prefix = \ + $(word 1, $(foreach c,$(1), \ + $(shell set -e; \ + if (which $(strip $(c))$(CC)) > /dev/null 2>&1 ; then \ + echo $(c); \ + fi))) + +# output directory for tests below +TMPOUT := $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/) + +# try-run +# Usage: option = $(call try-run, $(CC)...-o "$$TMP",option-ok,otherwise) +# Exit code chooses option. "$$TMP" is can be used as temporary file and +# is automatically cleaned up. +try-run = $(shell set -e; \ + TMP="$(TMPOUT).$$$$.tmp"; \ + TMPO="$(TMPOUT).$$$$.o"; \ + if ($(1)) >/dev/null 2>&1; \ + then echo "$(2)"; \ + else echo "$(3)"; \ + fi; \ + rm -f "$$TMP" "$$TMPO") + +# as-option +# Usage: cflags-y += $(call as-option,-Wa$(comma)-isa=foo,) + +as-option = $(call try-run,\ + $(CC) $(KBUILD_CFLAGS) $(1) -c -x assembler /dev/null -o "$$TMP",$(1),$(2)) + +# as-instr +# Usage: cflags-y += $(call as-instr,instr,option1,option2) + +as-instr = $(call try-run,\ + printf "%b\n" "$(1)" | $(CC) $(KBUILD_AFLAGS) -c -x assembler -o "$$TMP" -,$(2),$(3)) + +# cc-option +# Usage: cflags-y += $(call cc-option,-march=winchip-c6,-march=i586) + +cc-option = $(call try-run,\ + $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",$(1),$(2)) + +# cc-option-yn +# Usage: flag := $(call cc-option-yn,-march=winchip-c6) +cc-option-yn = $(call try-run,\ + $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",y,n) + +# cc-option-align +# Prefix align with either -falign or -malign +cc-option-align = $(subst -functions=0,,\ + $(call cc-option,-falign-functions=0,-malign-functions=0)) + +# cc-disable-warning +# Usage: cflags-y += $(call cc-disable-warning,unused-but-set-variable) +cc-disable-warning = $(call try-run,\ + $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) -W$(strip $(1)) -c -x c /dev/null -o "$$TMP",-Wno-$(strip $(1))) + +# cc-version +# Usage gcc-ver := $(call cc-version) +cc-version = $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-version.sh $(CC)) + +# cc-fullversion +# Usage gcc-ver := $(call cc-fullversion) +cc-fullversion = $(shell $(CONFIG_SHELL) \ + $(srctree)/scripts/gcc-version.sh -p $(CC)) + +# cc-ifversion +# Usage: EXTRA_CFLAGS += $(call cc-ifversion, -lt, 0402, -O1) +cc-ifversion = $(shell [ $(call cc-version, $(CC)) $(1) $(2) ] && echo $(3)) + +# cc-ldoption +# Usage: ldflags += $(call cc-ldoption, -Wl$(comma)--hash-style=both) +cc-ldoption = $(call try-run,\ + $(CC) $(1) -nostdlib -x c /dev/null -o "$$TMP",$(1),$(2)) + +# ld-option +# Usage: LDFLAGS += $(call ld-option, -X) +ld-option = $(call try-run,\ + $(CC) /dev/null -c -o "$$TMPO" ; $(LD) $(1) "$$TMPO" -o "$$TMP",$(1),$(2)) + +# ar-option +# Usage: KBUILD_ARFLAGS := $(call ar-option,D) +# Important: no spaces around options +ar-option = $(call try-run, $(AR) rc$(1) "$$TMP",$(1),$(2)) + +###### + +### +# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj= +# Usage: +# $(Q)$(MAKE) $(build)=dir +build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj + +### +# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.modbuiltin obj= +# Usage: +# $(Q)$(MAKE) $(modbuiltin)=dir +modbuiltin := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.modbuiltin obj + +# Prefix -I with $(srctree) if it is not an absolute path. +# skip if -I has no parameter +addtree = $(if $(patsubst -I%,%,$(1)), \ +$(if $(filter-out -I/%,$(1)),$(patsubst -I%,-I$(srctree)/%,$(1))) $(1)) + +# Find all -I options and call addtree +flags = $(foreach o,$($(1)),$(if $(filter -I%,$(o)),$(call addtree,$(o)),$(o))) + +# echo command. +# Short version is used, if $(quiet) equals `quiet_', otherwise full one. +echo-cmd = $(if $($(quiet)cmd_$(1)),\ + echo ' $(call escsq,$($(quiet)cmd_$(1)))$(echo-why)';) + +# printing commands +cmd = @$(echo-cmd) $(cmd_$(1)) + +# Add $(obj)/ for paths that are not absolute +objectify = $(foreach o,$(1),$(if $(filter /%,$(o)),$(o),$(obj)/$(o))) + +### +# if_changed - execute command if any prerequisite is newer than +# target, or command line has changed +# if_changed_dep - as if_changed, but uses fixdep to reveal dependencies +# including used config symbols +# if_changed_rule - as if_changed but execute rule instead +# See Documentation/kbuild/makefiles.txt for more info + +ifneq ($(KBUILD_NOCMDDEP),1) +# Check if both arguments has same arguments. Result is empty string if equal. +# User may override this check using make KBUILD_NOCMDDEP=1 +arg-check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \ + $(filter-out $(cmd_$@), $(cmd_$(1))) ) +else +arg-check = $(if $(strip $(cmd_$@)),,1) +endif + +# >'< substitution is for echo to work, +# >$< substitution to preserve $ when reloading .cmd file +# note: when using inline perl scripts [perl -e '...$$t=1;...'] +# in $(cmd_xxx) double $$ your perl vars +make-cmd = $(subst \\,\\\\,$(subst \#,\\\#,$(subst $$,$$$$,$(call escsq,$(cmd_$(1)))))) + +# Find any prerequisites that is newer than target or that does not exist. +# PHONY targets skipped in both cases. +any-prereq = $(filter-out $(PHONY),$?) $(filter-out $(PHONY) $(wildcard $^),$^) + +# Execute command if command has changed or prerequisite(s) are updated. +# +if_changed = $(if $(strip $(any-prereq) $(arg-check)), \ + @set -e; \ + $(echo-cmd) $(cmd_$(1)); \ + echo 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd) + +# Execute the command and also postprocess generated .d dependencies file. +if_changed_dep = $(if $(strip $(any-prereq) $(arg-check) ), \ + @set -e; \ + $(echo-cmd) $(cmd_$(1)); \ + scripts/basic/fixdep $(depfile) $@ '$(make-cmd)' > $(dot-target).tmp;\ + rm -f $(depfile); \ + mv -f $(dot-target).tmp $(dot-target).cmd) + +# Usage: $(call if_changed_rule,foo) +# Will check if $(cmd_foo) or any of the prerequisites changed, +# and if so will execute $(rule_foo). +if_changed_rule = $(if $(strip $(any-prereq) $(arg-check) ), \ + @set -e; \ + $(rule_$(1))) + +### +# why - tell why a a target got build +# enabled by make V=2 +# Output (listed in the order they are checked): +# (1) - due to target is PHONY +# (2) - due to target missing +# (3) - due to: file1.h file2.h +# (4) - due to command line change +# (5) - due to missing .cmd file +# (6) - due to target not in $(targets) +# (1) PHONY targets are always build +# (2) No target, so we better build it +# (3) Prerequisite is newer than target +# (4) The command line stored in the file named dir/.target.cmd +# differed from actual command line. This happens when compiler +# options changes +# (5) No dir/.target.cmd file (used to store command line) +# (6) No dir/.target.cmd file and target not listed in $(targets) +# This is a good hint that there is a bug in the kbuild file +ifeq ($(KBUILD_VERBOSE),2) +why = \ + $(if $(filter $@, $(PHONY)),- due to target is PHONY, \ + $(if $(wildcard $@), \ + $(if $(strip $(any-prereq)),- due to: $(any-prereq), \ + $(if $(arg-check), \ + $(if $(cmd_$@),- due to command line change, \ + $(if $(filter $@, $(targets)), \ + - due to missing .cmd file, \ + - due to $(notdir $@) not in $$(targets) \ + ) \ + ) \ + ) \ + ), \ + - due to target missing \ + ) \ + ) + +echo-why = $(call escsq, $(strip $(why))) +endif diff --git a/dts/scripts/basic/fixdep b/dts/scripts/basic/fixdep new file mode 100755 index 0000000000..cc412bec06 --- /dev/null +++ b/dts/scripts/basic/fixdep @@ -0,0 +1,27 @@ +#!/bin/sh + +# Simplfied version of Linux scripts/basic/fixdep. We don't need +# CONFIG tracking etc for this usecase. + + +# Fixdep's interface is described: + +# It is invoked as +# +# fixdep <depfile> <target> <cmdline> +# +# and will read the dependency file <depfile> +# +# The transformed dependency snipped is written to stdout. +# +# It first generates a line +# +# cmd_<target> = <cmdline> +# +# and then basically copies the .<target>.d file to stdout, in the +# process filtering out the dependency on autoconf.h and adding +# dependencies on include/config/my/option.h for every +# CONFIG_MY_OPTION encountered in any of the prequisites. + +echo cmd_$2 = $3 +cat $1 diff --git a/dts/scripts/cronjob b/dts/scripts/cronjob new file mode 100755 index 0000000000..eeedca0506 --- /dev/null +++ b/dts/scripts/cronjob @@ -0,0 +1,115 @@ +#!/bin/bash + +set -e + +cd $(dirname $0)/.. + +UPSTREAM_GIT="git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git" + +BRANCHES="master filter-state upstream/master upstream/dts" + +if [ ! -f scripts/filter.sh ] ; then + echo "`pwd`: does not appear to be a device-tree.git" 1>&2 + exit 1 +fi + +if [ -z "$LATEST_VERSION" ] ; then + FINGER_BANNER="https://www.kernel.org/finger_banner" + LATEST_VERSION=$(wget --quiet -O - "$FINGER_BANNER" |\ + sed -n -e '0,/^The latest mainline version of the Linux kernel is:\s*\(.*\)$/s//\1/p') +fi + +if [ -z "$LATEST_VERSION" ] ; then + echo "Unable to determine latest version" 1>&2 + exit 1 +fi + +echo "Latest Version: v$LATEST_VERSION" +if ! git show-ref --quiet --verify refs/tags/v${LATEST_VERSION} ; then + echo "Latest version is new" +fi +echo + +echo "Current State:" +for branch in $BRANCHES ; do + REF=$(git show-ref --verify refs/heads/${branch}) + if [ $? -ne 0 ] ; then + echo "Tree is missing required branch ${branch}, aborting" 1>&2 + exit 1 + fi + echo " ${REF}" +done +echo + +trap ' +if [ -n "$FILTER_OUTPUT" ] ; then + echo "---------------------------------------------------------------------" + echo "Filter Output:" + echo "---------------------------------------------------------------------" + echo "$FILTER_OUTPUT" + echo +fi +if [ -n "$MERGE_OUTPUT" ] ; then + echo "---------------------------------------------------------------------" + echo "Merge Output:" + echo "---------------------------------------------------------------------" + echo "$MERGE_OUTPUT" + echo +fi +' EXIT + +FILTER_OUTPUT=`( +set -e +echo "Switching to master branch" +git checkout master + +echo "Fetching $UPSTREAM_GIT master" +git fetch --tags "$UPSTREAM_GIT" master +echo + +echo "Filtering" +./scripts/filter.sh +echo +) 2>&1 ` + +#git push --dry-run origin filter-state upstream/dts upstream/master +#git push --dry-run origin --tags +#echo + +DATE=$(date +%Y%m%d) +LATEST=latest-${DATE} +MERGE_OUTPUT=`( +set -e +git checkout -b ${LATEST} origin/master +git merge --no-edit upstream/dts +) 2>&1 ` +REF=$(git show-ref --verify refs/heads/${LATEST}) +echo "Testing: ${REF}" +if git log ${LATEST} -- MAINTAINERS | grep --quiet . ; then + echo "Filter branch has upstream-only content (MAINTAINERS file)" + exit 1 +fi + +make clean -s +TEST_OUTPUT=`make -k -s 2>&1 || true` +if [ -z "${TEST_OUTPUT}" ]; then + echo "Success!" +else + echo "---------------------------------------------------------------------" + echo "Test Output:" + echo "---------------------------------------------------------------------" + echo "$TEST_OUTPUT" +fi +echo + +echo "Switching back to master branch" +git checkout master + +echo "Final State:" +for branch in ${BRANCHES} ; do + REF=$(git show-ref --verify refs/heads/${branch}) + echo " ${REF}" +done +echo + +exit 0 diff --git a/dts/scripts/filter.sh b/dts/scripts/filter.sh new file mode 100755 index 0000000000..e82218a1ca --- /dev/null +++ b/dts/scripts/filter.sh @@ -0,0 +1,37 @@ +#!/bin/sh + +# git branch -D upstream/rewritten-prev upstream/master upstream/rewritten filter-state + +set -e + +export SCRIPTS=$(dirname $(readlink -f $0)) + +UPSTREAM_MASTER=upstream/master +UPSTREAM_REWRITTEN=upstream/dts + +LAST=$(git show-ref -s refs/heads/$UPSTREAM_MASTER||true) +if [ -n "$LAST" ] ; then + RANGE="$LAST..$UPSTREAM_REWRITTEN" +else + # This must be a new conversion... + RANGE="$UPSTREAM_REWRITTEN" +fi + +FETCH_HEAD=$(git rev-parse FETCH_HEAD) +if [ "$LAST" = "$FETCH_HEAD" ] ; then + echo "Nothing new in FETCH_HEAD: $FETCH_HEAD" + exit 0 +fi + +rm -f .git/refs/original/refs/heads/${UPSTREAM_REWRITTEN} + +git branch -f $UPSTREAM_REWRITTEN FETCH_HEAD + +sh $SCRIPTS/git-filter-branch --force \ + --index-filter ${SCRIPTS}/index-filter.sh \ + --msg-filter 'cat && /bin/echo -e "\n[ upstream commit: $GIT_COMMIT ]"' \ + --tag-name-filter 'while read t ; do /bin/echo -n $t-dts-raw ; done' \ + --prune-empty --state-branch refs/heads/filter-state \ + -- $RANGE + +git branch -f $UPSTREAM_MASTER FETCH_HEAD diff --git a/dts/scripts/flatten-symlinks.sh b/dts/scripts/flatten-symlinks.sh new file mode 100755 index 0000000000..84d007f40f --- /dev/null +++ b/dts/scripts/flatten-symlinks.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +set -e + +while read mode object stage path ; do + case "$mode" in + 120000) + # symbolic link + deref=$(echo $GIT_COMMIT:$path | git cat-file --batch-check='deref-ok %(objectname)' --follow-symlinks) + case "$deref" in + deref-ok*) + echo -e "100644 ${deref#deref-ok } $stage\t$path" + ;; + dangling*) # skip + ;; + *) # the rest, missing etc + echo >&2 "Failed to parse symlink $GIT_COMMIT:$path $deref" + exit 1 + ;; + esac + ;; + 100*) + # Regular file, just pass through + echo -e "$mode $object $stage\t$path" + ;; + *) + echo >&2 "Unhandled ls-tree entry: $line" + exit 1 + ;; + esac +done diff --git a/dts/scripts/git-filter-branch b/dts/scripts/git-filter-branch new file mode 100755 index 0000000000..0e839ae682 --- /dev/null +++ b/dts/scripts/git-filter-branch @@ -0,0 +1,557 @@ +#!/bin/sh +# +# Rewrite revision history +# Copyright (c) Petr Baudis, 2006 +# Minimal changes to "port" it to core-git (c) Johannes Schindelin, 2007 +# +# Lets you rewrite the revision history of the current branch, creating +# a new branch. You can specify a number of filters to modify the commits, +# files and trees. + +# The following functions will also be available in the commit filter: + +export PATH=/usr/lib/git-core:$PATH + +functions=$(cat << \EOF +warn () { + echo "$*" >&2 +} + +map() +{ + # if it was not rewritten, take the original + if test -r "$workdir/../map/$1" + then + cat "$workdir/../map/$1" + else + echo "$1" + fi +} + +# if you run 'skip_commit "$@"' in a commit filter, it will print +# the (mapped) parents, effectively skipping the commit. + +skip_commit() +{ + shift; + while [ -n "$1" ]; + do + shift; + map "$1"; + shift; + done; +} + +# if you run 'git_commit_non_empty_tree "$@"' in a commit filter, +# it will skip commits that leave the tree untouched, commit the other. +git_commit_non_empty_tree() +{ + if test $# = 3 && test "$1" = $(git rev-parse "$3^{tree}"); then + map "$3" + else + git commit-tree "$@" + fi +} +# override die(): this version puts in an extra line break, so that +# the progress is still visible + +die() +{ + echo >&2 + echo "$*" >&2 + exit 1 +} +EOF +) + +eval "$functions" + +# When piped a commit, output a script to set the ident of either +# "author" or "committer + +set_ident () { + lid="$(echo "$1" | tr "[A-Z]" "[a-z]")" + uid="$(echo "$1" | tr "[a-z]" "[A-Z]")" + pick_id_script=' + /^'$lid' /{ + s/'\''/'\''\\'\'\''/g + h + s/^'$lid' \([^<]*\) <[^>]*> .*$/\1/ + s/'\''/'\''\'\'\''/g + s/.*/GIT_'$uid'_NAME='\''&'\''; export GIT_'$uid'_NAME/p + + g + s/^'$lid' [^<]* <\([^>]*\)> .*$/\1/ + s/'\''/'\''\'\'\''/g + s/.*/GIT_'$uid'_EMAIL='\''&'\''; export GIT_'$uid'_EMAIL/p + + g + s/^'$lid' [^<]* <[^>]*> \(.*\)$/\1/ + s/'\''/'\''\'\'\''/g + s/.*/GIT_'$uid'_DATE='\''&'\''; export GIT_'$uid'_DATE/p + + q + } + ' + + LANG=C LC_ALL=C sed -ne "$pick_id_script" + # Ensure non-empty id name. + echo "case \"\$GIT_${uid}_NAME\" in \"\") GIT_${uid}_NAME=\"\${GIT_${uid}_EMAIL%%@*}\" && export GIT_${uid}_NAME;; esac" +} + +USAGE="[--env-filter <command>] [--tree-filter <command>] + [--index-filter <command>] [--parent-filter <command>] + [--msg-filter <command>] [--commit-filter <command>] + [--tag-name-filter <command>] [--subdirectory-filter <directory>] + [--original <namespace>] [-d <directory>] [-f | --force] + [--state-branch <branch>] + [<rev-list options>...]" + +OPTIONS_SPEC= +. git-sh-setup + +if [ "$(is_bare_repository)" = false ]; then + require_clean_work_tree 'rewrite branches' +fi + +tempdir=.git-rewrite +filter_env= +filter_tree= +filter_index= +filter_parent= +filter_msg=cat +filter_commit= +filter_tag_name= +filter_subdir= +state_branch= +orig_namespace=refs/original/ +force= +prune_empty= +remap_to_ancestor= +while : +do + case "$1" in + --) + shift + break + ;; + --force|-f) + shift + force=t + continue + ;; + --remap-to-ancestor) + # deprecated ($remap_to_ancestor is set now automatically) + shift + remap_to_ancestor=t + continue + ;; + --prune-empty) + shift + prune_empty=t + continue + ;; + -*) + ;; + *) + break; + esac + + # all switches take one argument + ARG="$1" + case "$#" in 1) usage ;; esac + shift + OPTARG="$1" + shift + + case "$ARG" in + -d) + tempdir="$OPTARG" + ;; + --env-filter) + filter_env="$OPTARG" + ;; + --tree-filter) + filter_tree="$OPTARG" + ;; + --index-filter) + filter_index="$OPTARG" + ;; + --parent-filter) + filter_parent="$OPTARG" + ;; + --msg-filter) + filter_msg="$OPTARG" + ;; + --commit-filter) + filter_commit="$functions; $OPTARG" + ;; + --tag-name-filter) + filter_tag_name="$OPTARG" + ;; + --subdirectory-filter) + filter_subdir="$OPTARG" + remap_to_ancestor=t + ;; + --original) + orig_namespace=$(expr "$OPTARG/" : '\(.*[^/]\)/*$')/ + ;; + --state-branch) + state_branch="$OPTARG" + ;; + *) + usage + ;; + esac +done + +case "$prune_empty,$filter_commit" in +,) + filter_commit='git commit-tree "$@"';; +t,) + filter_commit="$functions;"' git_commit_non_empty_tree "$@"';; +,*) + ;; +*) + die "Cannot set --prune-empty and --commit-filter at the same time" +esac + +case "$force" in +t) + rm -rf "$tempdir" +;; +'') + test -d "$tempdir" && + die "$tempdir already exists, please remove it" +esac +mkdir -p "$tempdir/t" && +tempdir="$(cd "$tempdir"; pwd)" && +cd "$tempdir/t" && +workdir="$(pwd)" || +die "" + +# Remove tempdir on exit +trap 'cd ../..; rm -rf "$tempdir"' 0 + +ORIG_GIT_DIR="$GIT_DIR" +ORIG_GIT_WORK_TREE="$GIT_WORK_TREE" +ORIG_GIT_INDEX_FILE="$GIT_INDEX_FILE" +GIT_WORK_TREE=. +export GIT_DIR GIT_WORK_TREE + +# Make sure refs/original is empty +git for-each-ref > "$tempdir"/backup-refs || exit +while read sha1 type name +do + case "$force,$name" in + ,$orig_namespace*) + die "Cannot create a new backup. +A previous backup already exists in $orig_namespace +Force overwriting the backup with -f" + ;; + t,$orig_namespace*) + git update-ref -d "$name" $sha1 + ;; + esac +done < "$tempdir"/backup-refs + +# The refs should be updated if their heads were rewritten +git rev-parse --no-flags --revs-only --symbolic-full-name \ + --default HEAD "$@" > "$tempdir"/raw-heads || exit +sed -e '/^^/d' "$tempdir"/raw-heads >"$tempdir"/heads + +test -s "$tempdir"/heads || + die "Which ref do you want to rewrite?" + +GIT_INDEX_FILE="$(pwd)/../index" +export GIT_INDEX_FILE + +# map old->new commit ids for rewriting parents +mkdir ../map || die "Could not create map/ directory" + +if [ -n "$state_branch" ] ; then + state_commit=`git show-ref -s "$state_branch"` + if [ -n "$state_commit" ] ; then + echo "Populating map from $state_branch ($state_commit)" 1>&2 + git show "$state_commit":filter.map | + perl -n -e 'm/(.*):(.*)/ or die; + open F, ">../map/$1" or die; + print F "$2" or die; + close(F) or die' + else + echo "Branch $state_branch does not exist. Will create" 1>&2 + fi +fi + +# we need "--" only if there are no path arguments in $@ +nonrevs=$(git rev-parse --no-revs "$@") || exit +if test -z "$nonrevs" +then + dashdash=-- +else + dashdash= + remap_to_ancestor=t +fi + +rev_args=$(git rev-parse --revs-only "$@") + +case "$filter_subdir" in +"") + eval set -- "$(git rev-parse --sq --no-revs "$@")" + ;; +*) + eval set -- "$(git rev-parse --sq --no-revs "$@" $dashdash \ + "$filter_subdir")" + ;; +esac + +git rev-list --reverse --topo-order --default HEAD \ + --parents --simplify-merges $rev_args "$@" > ../revs || + die "Could not get the commits" +commits=$(wc -l <../revs | tr -d " ") + +test $commits -eq 0 && die "Found nothing to rewrite" + +# Rewrite the commits + +git_filter_branch__commit_count=0 +while read commit parents; do + git_filter_branch__commit_count=$(($git_filter_branch__commit_count+1)) + printf "\rRewrite $commit ($git_filter_branch__commit_count/$commits)" + + case "$filter_subdir" in + "") + git read-tree -i -m $commit + ;; + *) + # The commit may not have the subdirectory at all + err=$(git read-tree -i -m $commit:"$filter_subdir" 2>&1) || { + if ! git rev-parse -q --verify $commit:"$filter_subdir" + then + rm -f "$GIT_INDEX_FILE" + else + echo >&2 "$err" + false + fi + } + esac || die "Could not initialize the index" + + GIT_COMMIT=$commit + export GIT_COMMIT + git cat-file commit "$commit" >../commit || + die "Cannot read commit $commit" + + eval "$(set_ident AUTHOR <../commit)" || + die "setting author failed for commit $commit" + eval "$(set_ident COMMITTER <../commit)" || + die "setting committer failed for commit $commit" + eval "$filter_env" < /dev/null || + die "env filter failed: $filter_env" + + if [ "$filter_tree" ]; then + git checkout-index -f -u -a || + die "Could not checkout the index" + # files that $commit removed are now still in the working tree; + # remove them, else they would be added again + git clean -d -q -f -x + eval "$filter_tree" < /dev/null || + die "tree filter failed: $filter_tree" + + ( + git diff-index -r --name-only --ignore-submodules $commit && + git ls-files --others + ) > "$tempdir"/tree-state || exit + git update-index --add --replace --remove --stdin \ + < "$tempdir"/tree-state || exit + fi + + eval "$filter_index" < /dev/null || + die "index filter failed: $filter_index" + + parentstr= + for parent in $parents; do + for reparent in $(map "$parent"); do + parentstr="$parentstr -p $reparent" + done + done + if [ "$filter_parent" ]; then + parentstr="$(echo "$parentstr" | eval "$filter_parent")" || + die "parent filter failed: $filter_parent" + fi + + sed -e '1,/^$/d' <../commit | \ + eval "$filter_msg" > ../message || + die "msg filter failed: $filter_msg" + workdir=$workdir /bin/sh -c "$filter_commit" "git commit-tree" \ + $(git write-tree) $parentstr < ../message > ../map/$commit || + die "could not write rewritten commit" +done <../revs + +# If we are filtering for paths, as in the case of a subdirectory +# filter, it is possible that a specified head is not in the set of +# rewritten commits, because it was pruned by the revision walker. +# Ancestor remapping fixes this by mapping these heads to the unique +# nearest ancestor that survived the pruning. + +if test "$remap_to_ancestor" = t +then + while read ref + do + sha1=$(git rev-parse "$ref"^0) + test -f "$workdir"/../map/$sha1 && continue + ancestor=$(git rev-list --simplify-merges -1 "$ref" "$@") + test "$ancestor" && echo $(map $ancestor) >> "$workdir"/../map/$sha1 + done < "$tempdir"/heads +fi + +# Finally update the refs + +_x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]' +_x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40" +echo +while read ref +do + # avoid rewriting a ref twice + test -f "$orig_namespace$ref" && continue + + sha1=$(git rev-parse "$ref"^0) + rewritten=$(map $sha1) + + test $sha1 = "$rewritten" && + warn "WARNING: Ref '$ref' is unchanged" && + continue + + case "$rewritten" in + '') + echo "Ref '$ref' was deleted" + git update-ref -m "filter-branch: delete" -d "$ref" $sha1 || + die "Could not delete $ref" + ;; + $_x40) + echo "Ref '$ref' was rewritten" + if ! git update-ref -m "filter-branch: rewrite" \ + "$ref" $rewritten $sha1 2>/dev/null; then + if test $(git cat-file -t "$ref") = tag; then + if test -z "$filter_tag_name"; then + warn "WARNING: You said to rewrite tagged commits, but not the corresponding tag." + warn "WARNING: Perhaps use '--tag-name-filter cat' to rewrite the tag." + fi + else + die "Could not rewrite $ref" + fi + fi + ;; + *) + # NEEDSWORK: possibly add -Werror, making this an error + warn "WARNING: '$ref' was rewritten into multiple commits:" + warn "$rewritten" + warn "WARNING: Ref '$ref' points to the first one now." + rewritten=$(echo "$rewritten" | head -n 1) + git update-ref -m "filter-branch: rewrite to first" \ + "$ref" $rewritten $sha1 || + die "Could not rewrite $ref" + ;; + esac + git update-ref -m "filter-branch: backup" "$orig_namespace$ref" $sha1 || + exit +done < "$tempdir"/heads + +# TODO: This should possibly go, with the semantics that all positive given +# refs are updated, and their original heads stored in refs/original/ +# Filter tags + +if [ "$filter_tag_name" ]; then + git for-each-ref --format='%(objectname) %(objecttype) %(refname)' refs/tags | + while read sha1 type ref; do + ref="${ref#refs/tags/}" + # XXX: Rewrite tagged trees as well? + if [ "$type" != "commit" -a "$type" != "tag" ]; then + continue; + fi + + if [ "$type" = "tag" ]; then + # Dereference to a commit + sha1t="$sha1" + sha1="$(git rev-parse -q "$sha1"^{commit})" || continue + fi + + [ -f "../map/$sha1" ] || continue + new_sha1="$(cat "../map/$sha1")" + GIT_COMMIT="$sha1" + export GIT_COMMIT + new_ref="$(echo "$ref" | eval "$filter_tag_name")" || + die "tag name filter failed: $filter_tag_name" + + echo "$ref -> $new_ref ($sha1 -> $new_sha1)" + + if [ "$type" = "tag" ]; then + new_sha1=$( ( printf 'object %s\ntype commit\ntag %s\n' \ + "$new_sha1" "$new_ref" + git cat-file tag "$ref" | + awk '/^tagger/ { tagged=1 } + /^$/ { if (!tagged && !done) { print "tagger Unknown <unknown@example.com> 0 +0000" } ; done=1 } + // { print }' | + sed -n \ + -e '1,/^$/{ + /^object /d + /^type /d + /^tag /d + }' \ + -e '/^-----BEGIN PGP SIGNATURE-----/q' \ + -e 'p' ) | + git mktag) || + die "Could not create new tag object for $ref" + if git cat-file tag "$ref" | \ + sane_grep '^-----BEGIN PGP SIGNATURE-----' >/dev/null 2>&1 + then + warn "gpg signature stripped from tag object $sha1t" + fi + fi + + git update-ref "refs/tags/$new_ref" "$new_sha1" || + die "Could not write tag $new_ref" + done +fi + +if [ -n "$state_branch" ] ; then + echo "Saving rewrite state to $state_branch" 1>&2 + STATE_BLOB=$(ls ../map | + perl -n -e 'chomp(); + open F, "<../map/$_" or die; + chomp($f = <F>); print "$_:$f\n";' | + git hash-object -w --stdin ) + STATE_TREE=$(/bin/echo -e "100644 blob $STATE_BLOB\tfilter.map" | git mktree) + STATE_PARENT=$(git show-ref -s "$state_branch") + unset GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_AUTHOR_DATE + unset GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL GIT_COMMITTER_DATE + if [ -n "$STATE_PARENT" ] ; then + STATE_COMMIT=$(/bin/echo "Sync" | git commit-tree "$STATE_TREE" -p "$STATE_PARENT") + else + STATE_COMMIT=$(/bin/echo "Sync" | git commit-tree "$STATE_TREE" ) + fi + git update-ref "$state_branch" "$STATE_COMMIT" +fi + +cd ../.. +rm -rf "$tempdir" + +trap - 0 + +unset GIT_DIR GIT_WORK_TREE GIT_INDEX_FILE +test -z "$ORIG_GIT_DIR" || { + GIT_DIR="$ORIG_GIT_DIR" && export GIT_DIR +} +test -z "$ORIG_GIT_WORK_TREE" || { + GIT_WORK_TREE="$ORIG_GIT_WORK_TREE" && + export GIT_WORK_TREE +} +test -z "$ORIG_GIT_INDEX_FILE" || { + GIT_INDEX_FILE="$ORIG_GIT_INDEX_FILE" && + export GIT_INDEX_FILE +} + +if [ "$(is_bare_repository)" = false ]; then + git read-tree -u -m HEAD || exit +fi + +exit 0 diff --git a/dts/scripts/index-filter.sh b/dts/scripts/index-filter.sh new file mode 100755 index 0000000000..e672867ce3 --- /dev/null +++ b/dts/scripts/index-filter.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +set -e +set -o pipefail + +crumbs=/tmp/device-tree-export +git ls-files -s | tee $crumbs-orig | \ + ${SCRIPTS}/flatten-symlinks.sh | tee $crumbs-flattened | \ + sed -n -f ${SCRIPTS}/rewrite-paths.sed | tee $crumbs-rewritten | \ + GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info + +if [ -f "$GIT_INDEX_FILE.new" ] ; then + mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE" +else + rm "$GIT_INDEX_FILE" +fi + +exit 0 diff --git a/dts/scripts/merge-new-release.sh b/dts/scripts/merge-new-release.sh new file mode 100755 index 0000000000..cf2ac41915 --- /dev/null +++ b/dts/scripts/merge-new-release.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +case $1 in + v*-dts) ;; + '') + echo >&2 "No version given" + exit 1 + ;; + *) + echo >&2 "Unexpected version: $1" + exit 1 + ;; +esac + +v=$1 + +set -ex + +git merge --no-edit "${v}-raw" +git clean -fdqx +make -k -j12 -s +git tag -s -m "Tagging ${v}" -u 695A46C6 "${v}" diff --git a/dts/scripts/rewrite-paths.sed b/dts/scripts/rewrite-paths.sed new file mode 100644 index 0000000000..b73fbce71b --- /dev/null +++ b/dts/scripts/rewrite-paths.sed @@ -0,0 +1,38 @@ +# Keep the copyright. Also ensures we never have a completely empty commit. +/\tCOPYING$/p + +# A few architectures have dts files at non standard paths. Massage those into +# a standard arch/ARCH/boot/dts first. + +# symlink: arch/microblaze/boot/dts/system.dts -> ../../platform/generic/system.dts +\,\tarch/microblaze/boot/dts/system.dts$,d +s,\tarch/microblaze/platform/generic/\(system.dts\)$,\tarch/microblaze/boot/dts/\1,g + +# arch/mips/lantiq/dts/easy50712.dts +# arch/mips/lantiq/dts/danube.dtsi +# arch/mips/netlogic/dts/xlp_evp.dts +# arch/mips/ralink/dts/rt3050.dtsi +# arch/mips/ralink/dts/rt3052_eval.dts +s,\tarch/mips/\([^/]*\)/dts/\(.*\.dts.\?\)$,\tarch/mips/boot/dts/\2,g + +# arch/mips/cavium-octeon/octeon_68xx.dts +# arch/mips/cavium-octeon/octeon_3xxx.dts +# arch/mips/mti-sead3/sead3.dts +s,\tarch/mips/\([^/]*\)/\([^/]*\.dts.\?\)$,\tarch/mips/boot/dts/\2,g + +# arch/x86/platform/ce4100/falconfalls.dts +s,\tarch/x86/platform/ce4100/falconfalls.dts,\tarch/x86/boot/dts/falconfalls.dts,g + +# test cases +s,\tdrivers/of/testcase-data/,\ttestcase-data/,gp + +# Now rewrite generic DTS paths +s,\tarch/\([^/]*\)/boot/dts/\(.*\.dts.\?\)$,\tsrc/\1/\2,gp +s,\tarch/\([^/]*\)/boot/dts/\(.*\.h\)$,\tsrc/\1/\2,gp + +# Also rewrite the DTS include paths for dtc+cpp support +s,\tarch/\([^/]*\)/include/dts/,\tsrc/\1/include/,gp +s,\tinclude/dt-bindings/,\tinclude/dt-bindings/,gp + +# Rewrite the bindings subdirectory +s,\tDocumentation/devicetree/bindings/,\tBindings/,gp |