diff --git a/hooks/prebuild/eole/add-package-version-suffix b/hooks/prebuild/eole/add-package-version-suffix index 2f44498..cced4e5 100755 --- a/hooks/prebuild/eole/add-package-version-suffix +++ b/hooks/prebuild/eole/add-package-version-suffix @@ -3,7 +3,7 @@ cd src if [ ! -f debian/changelog ]; then - tamarin_info "No changelog. Skipping..." + tamarin_info "No changelog. Skipping adding suffix to package version" exit fi @@ -12,21 +12,28 @@ if [ $(tamarin_db get no_version_suffix 'no') == 'yes' ]; then exit fi +tamarin_info "Suffixing package version" if [ -d .git ]; then tamarin_info "It seems to be a Git repository. Generating version suffix based on Git history..." - commit_tag=$(git describe --match "pkg/*") - pkg_tag=$(git describe --match "pkg/*" --abbrev=0) - - commit_count=$(git rev-list --count ${pkg_tag}..HEAD) - current_commit=$(git log -n1 --pretty=format:%h) - tamarin_info $pkg_tag - tamarin_info $commit_count - tamarin_info $current_commit - version_suffix=~${commit_count}.${current_commit} + release_tag=$(git describe --match "release/*" --abbrev=0 2>/dev/null) + if [ -z "${release_tag}" ] + then + dev_commit_count=$(git rev-list --count --no-merges develop) + else + dev_commit_count=$(git rev-list --count ${release_tag}..master) + fi + if [ ${dev_commit_count} -gt 0 ] + then + build_level=$(tamarin_db get build_level 'dev') + version_suffix="~$build_level+${dev_commit_count}-$(git log -n1 --format=%h)" + else + version_suffix='' + fi else tamarin_info "Not a Git project. Fallback to timestamp for suffix generation..." version_suffix=tamarin$(date +%Y%m%d%H%M) fi -tamarin_info $version_suffix +tamarin_info "Suffixing package version with $version_suffix" sed -i "0,/(\(.*\))/s/(\(.*\))/(\1${version_suffix})/" debian/changelog +cp debian/changelog /dist/changelog diff --git a/hooks/prebuild/eole/create-changelog b/hooks/prebuild/eole/create-changelog index 68277d0..e1ffc4a 100755 --- a/hooks/prebuild/eole/create-changelog +++ b/hooks/prebuild/eole/create-changelog @@ -1,26 +1,36 @@ #!/usr/bin/env bash cd src - if [ -f debian/changelog ] || [ ! -d .git ]; then tamarin_info "Not a Git repository or Debian changelog already exists !" exit +else + tamarin_info "Creating changelog with commits information." fi # Get pkg tags as tie points in commit history pkg_tags="$(git for-each-ref --format '%(refname)' refs/tags | tac)" # Set starting commit -start_commit='HEAD' +ceiling_commit=$(git describe --match "build/*" --abbrev=0 2>/dev/null) +if [ -n "ceiling_commit" ] +then + ceiling_commit="HEAD" +fi +first_commit=$(git rev-list --max-parents=0 master) # Get commits log as changelog -current_release=$(git describe --match "release/*" --abbrev=0) +current_release_tag=$(git describe --match "release/*" --abbrev=0 2>/dev/null) -if [[ -z ${current_release} ]] +if [[ -z ${current_release_tag} ]] then - tamarin_warn "No release tag found, you repo must have a tag like 'release/*'" - exit 1 + tamarin_warn "No release tag found, you repo should have a tag like 'release/*'" + tamarin_info "Assuming tag release/0.0.0 on first commit of branch master" + current_release="release/0.0.0" + current_release_tag=${first_commit} +else + current_release=$current_release_tag fi touch debian/changelog @@ -29,92 +39,201 @@ project_name=$(tamarin_db get project_name) distribution=$(tamarin_db get distribution UNRELEASED) urgency=$(tamarin_db get urgency low) -function gen_changelog_entry { - start_commit=$1 - previous_pkg="$(git describe --long --always --match='pkg/*' $start_commit)" - if [[ "${previous_pkg}" =~ "pkg/" ]] - then - tamarin_info "dernier paquet trouvé : ${previous_pkg}" - extended_version=$(echo $previous_pkg | cut -d "/" -f4) - exploded_version="$(echo $extended_version | sed "s/\([a-z0-9.]\+\)-\([0-9]\+\)\(-\([0-9]\+\)-\(g[a-z0-9]\+\)\)\?$/\1 \2 \4 \5/")" - upstream_version=$(echo $exploded_version | cut -d " " -f1) - package_version=$(echo $exploded_version | cut -d " " -f2) - distance_to_pkg=$(echo $exploded_version | cut -d " " -f3) - if [[ "${distance_to_pkg}" > 0 ]] - then - tamarin_info "${distance_to_pkg} commit depuis le dernier paquet" - stop_commit="$(git describe --abbrev=0 --always --match='pkg/*' $start_commit)" - version=$(expr $package_version + 1) - else - stop_commit="$(git describe --abbrev=0 --always --match='pkg/*' ${start_commit}^1)" - version=$package_version - tamarin_info "version ${tamarin}" - fi - if [[ "${start_commit}" = "${stop_commit}" ]] - then - return 1 - fi - elif [[ "${start_commit}" = "${stop_commit}" ]] - then - return 1 - else - tamarin_info "Pas encore de paquet pour ce dépôt" - version="1" - upstream_version="${current_release#release/}" - stop_commit="${current_release}" - fi +function get_hash { + # Return commit hash from various pointer + pointer="$1" + echo "$(git log -n1 --format=%H ${pointer})" +} - # Set the top commiter as the maintainer of the project if not defined - # If commit is tagged with pkg/, use tagger name as maintainer - # Else if commit is not tagged with pkg/, use commiter name as maintainer - current_release="$(git describe --abbrev=0 --always --match='release/*' $start_commit)" - tamarin_info "Création de l’entrée de changelog entre ${start_commit} et ${stop_commit}" - if [[ "$current_release" = "$start_commit" ]] # No package yet, git describe --always returned commit itself +function get_previous_pkg_tag { + # Return previous pkg/* tag or current tag if no previous pkg/* exists. + commit="$1" + echo "$(git describe --abbrev=0 --always --match='pkg/*' $commit)" +} + +function parse_tag { + tag="$1" + flavor="${tag%%/*}" + extended_version="${tag##*/}" + if [ "$flavor" = "pkg" ] then - echo "on passe bien là" - current_release='UNRELEASED' + exploded_version="$(echo $extended_version | sed "s/\([a-z0-9.]\+\)-\([0-9]\+\)\(-[a-z]\++[0-9]\+\)\?\(-\([0-9]\+\)-\(g[a-z0-9]\+\)\)\?$/version:\1 revision:\2 modification:\3 distance:\5 anchor:\6/")" + elif [ "$flavor" = "release" ] + then + exploded_version="$(echo $extended_version | sed "s/\([a-z0-9.]\+\)\(-\([0-9]\+\)-\(g[a-z0-9]\+\)\)\?$/version:\1 distance:\3 anchor:\4/")" + fi + echo $exploded_version +} + +function get_distance_from_tag { + description_tag="$1" + tag=${description_tag%-*-*} + anchor="$2" + if [[ "$(get_hash $tag)" =~ "$(get_hash $anchor)" ]] + then + echo 0 + else + distance="$(parse_tag $description_tag)" + distance="${distance#*distance:}" + distance="${distance%% *}" + echo $distance + fi +} + +function get_upstream_version_from_tag { + tag="$1" + upstream="$(parse_tag $tag)" + upstream="${upstream#*version:}" + upstream="${upstream%% *}" + echo "$upstream" +} + +function get_package_version_from_tag { + tag="$1" + package="$(parse_tag $tag)" + package="${package#*revision:}" + package="${package%% *}" + echo "$package" +} + +function get_previous_release_tag { + # Return previous pkg/* tag or current tag if no previous pkg/* exists. + commit="$1" + echo "$(git describe --abbrev=0 --always --match='release/*' $commit)" +} + +function on_pkg_tag { + # Return 1 if current commit is tagged with pkg/* tag. + commit="$1" + nearest_old_pkg_tag="$(get_previous_pkg_tag $commit)" + if [ "$(get_hash ${commit})" = "$(get_hash ${nearest_old_pkg_tag})" ] + then + return 0 + else return 1 fi - if [ "${start_commit}" == "HEAD" ] +} + +function next_step { + # Return previous pkg/* tag or first commit if no pkg/* tag exists + commit="$1" + if [ "$(get_hash $commit)" = "$(get_hash $first_commit)" ] + then + echo $commit + elif on_pkg_tag $commit + then + nearest_old_pkg_tag="$(get_previous_pkg_tag ${commit}^1)" + else + nearest_old_pkg_tag="$(get_previous_pkg_tag ${commit})" + fi + if [[ "$nearest_old_pkg_tag" =~ 'pkg/' ]] + then + echo $nearest_old_pkg_tag + else + echo $first_commit + fi +} + +function date_from_commit { + # Return date suitable for changelog entry signature + commit="$1" + if [ "$(get_hash ${commit})" = "$(get_hash HEAD)" ] + then + package_date=$(date --rfc-2822) + else + maintainer_commit="$(get_previous_pkg_tag $commit)" + package_date="$(git tag -l --format='%(creator)' ${maintainer_commit})" + package_date="${package_date##*> }" + package_date="$(date --rfc-2822 -d @${package_date% *})" + fi + echo "$package_date" +} + +function packager_from_commit { + # Return Name id format, suitable for changelog entry signature + commit="$1" + if [ "${commit}" = "HEAD" ] then maintainer="$(git log -n1 --format='%cn <%ce>')" - maintainer=$(tamarin_db get maintainer "${maintainer}") else - maintainer_commit="$(git describe --abbrev=0 --always --match='pkg/*' $start_commit)" + maintainer_commit="$(get_previous_pkg_tag $commit)" maintainer="$(git tag -l --format='%(creator)' ${maintainer_commit})" + maintainer="${maintainer%>*}>" fi maintainer=$(tamarin_db get maintainer "${maintainer}") + echo "$maintainer" +} + +function next_version { + commit="$1" + # upstream version is given by most recent of release or pkg tag + previous_pkg="$(git describe --long --match='pkg/*' $commit 2>/dev/null)" + previous_release="$(git describe --long --match='release/*' $commit 2>/dev/null)" + if [ -n "$previous_release" ] && [ -n "$previous_pkg" ] + then + distance_from_pkg=$(get_distance_from_tag "$previous_pkg" "$commit") + distance_from_release=$(get_distance_from_tag "$previous_release" "$commit") + if [ $distance_from_release -le $distance_from_pkg ] + then + echo "$(get_upstream_version_from_tag $previous_release)-1" + else + echo "$(get_upstream_version_from_tag $previous_pkg)-$(expr $(get_package_version_from_tag $previous_pkg) + 1)" + fi + elif [ -n "$previous_release" ] + then + echo "$(get_upstream_version_from_tag $previous_release)-1" + elif [ -n "$previous_pkg" ] + then + echo "$(get_upstream_version_from_tag $previous_pkg)-$(expr $(get_package_version_from_tag $previous_pkg) + 1)" + else + echo tata + fi +} + +function gen_changelog_entry { + ceiling_commit=$1 + floor_commit="$(next_step "${ceiling_commit}")" + + if [ "$(get_hash ${ceiling_commit})" = "$(get_hash ${floor_commit})" ] + then + return 1 + fi + + if on_pkg_tag $ceiling_commit + then + version="$(get_upstream_version_from_tag $ceiling_commit)-$(get_package_version_from_tag $ceiling_commit)" + else + tamarin_info "current commit $ceiling_commit" + version=$(next_version $ceiling_commit) + fi + + #current_release="$(git describe --abbrev=0 --always --match='release/*' $ceiling_commit)" + tamarin_info "Création de l’entrée de changelog entre ${ceiling_commit} et ${floor_commit}" + + maintainer="$(packager_from_commit ${ceiling_commit})" + package_date="$(date_from_commit ${ceiling_commit})" - version=${upstream_version}-${version} version=${version/_/-} - tamarin_warn "traitement de la version $version" changelog_entry="${project_name} (${version}) ${distribution}; urgency=${urgency}" echo "$changelog_entry" >> debian/changelog echo >> debian/changelog - for commit in "$(git log --format='%H' ${stop_commit}..${start_commit})" + for commit in $(git log --no-merges --format='%H' ${floor_commit}..${ceiling_commit}) do subject="$(git log -n1 --format=%s ${commit})" - tamarin_info "${subject}" echo " * ${subject}" >> debian/changelog - start_commit="$(git log -n1 --format='%H' ${commit}^1)" + #ceiling_commit="$(git log -n1 --format='%H' ${commit}^1)" done echo >> debian/changelog - changelog_sign=" -- ${maintainer} $(date --rfc-2822)" + changelog_sign=" -- ${maintainer} ${package_date}" echo "$changelog_sign" >> debian/changelog echo >> debian/changelog - start_commit=${stop_commit} + ceiling_commit=${floor_commit} } function gen_changelog() { -# while [[ $current_release != 'UNRELEASED' ]] -# do -# echo $start_commit -# echo $current_release -# gen_changelog_entry $start_commit -# done - while gen_changelog_entry $start_commit + while gen_changelog_entry $ceiling_commit do - echo $changelog_entry + echo $changelog_entry done }