mirror of https://github.com/trapexit/mergerfs.git
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							202 lines
						
					
					
						
							4.9 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							202 lines
						
					
					
						
							4.9 KiB
						
					
					
				
								#!/bin/sh
							 | 
						|
								
							 | 
						|
								# Copyright (c) 2016, Antonio SJ Musumeci <trapexit@spawn.link>
							 | 
						|
								
							 | 
						|
								# Permission to use, copy, modify, and/or distribute this software for any
							 | 
						|
								# purpose with or without fee is hereby granted, provided that the above
							 | 
						|
								# copyright notice and this permission notice appear in all copies.
							 | 
						|
								
							 | 
						|
								# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
							 | 
						|
								# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
							 | 
						|
								# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
							 | 
						|
								# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
							 | 
						|
								# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
							 | 
						|
								# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
							 | 
						|
								# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
							 | 
						|
								
							 | 
						|
								# Default values
							 | 
						|
								NAME=""
							 | 
						|
								VERSION="::guess::"
							 | 
						|
								DISTRO="::guess::"
							 | 
						|
								CODENAME="::guess::"
							 | 
						|
								URGENCY="medium"
							 | 
						|
								
							 | 
						|
								# Function to display usage
							 | 
						|
								usage() {
							 | 
						|
								    cat << EOF
							 | 
						|
								Usage: $0 --name NAME [OPTIONS]
							 | 
						|
								
							 | 
						|
								Generated debian/changelog from git log
							 | 
						|
								
							 | 
						|
								Options:
							 | 
						|
								    --name NAME        Name of package (required)
							 | 
						|
								    --version VERSION  Place in git history to include upto (default: ::guess::)
							 | 
						|
								    --distro DISTRO    Distribution name (default: ::guess::)
							 | 
						|
								    --codename NAME    Distribution codename (default: ::guess::)
							 | 
						|
								    --urgency URGENCY  Urgency (default: medium)
							 | 
						|
								    -h, --help         Show this help message
							 | 
						|
								EOF
							 | 
						|
								    exit 1
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Parse command line arguments
							 | 
						|
								while [ $# -gt 0 ]; do
							 | 
						|
								    case "$1" in
							 | 
						|
								        --name)
							 | 
						|
								            NAME="$2"
							 | 
						|
								            shift 2
							 | 
						|
								            ;;
							 | 
						|
								        --version)
							 | 
						|
								            VERSION="$2"
							 | 
						|
								            shift 2
							 | 
						|
								            ;;
							 | 
						|
								        --distro)
							 | 
						|
								            DISTRO="$2"
							 | 
						|
								            shift 2
							 | 
						|
								            ;;
							 | 
						|
								        --codename)
							 | 
						|
								            CODENAME="$2"
							 | 
						|
								            shift 2
							 | 
						|
								            ;;
							 | 
						|
								        --urgency)
							 | 
						|
								            URGENCY="$2"
							 | 
						|
								            shift 2
							 | 
						|
								            ;;
							 | 
						|
								        -h|--help)
							 | 
						|
								            usage
							 | 
						|
								            ;;
							 | 
						|
								        *)
							 | 
						|
								            echo "Unknown option: $1" >&2
							 | 
						|
								            usage
							 | 
						|
								            ;;
							 | 
						|
								    esac
							 | 
						|
								done
							 | 
						|
								
							 | 
						|
								# Check required arguments
							 | 
						|
								if [ -z "$NAME" ]; then
							 | 
						|
								    echo "Error: --name is required" >&2
							 | 
						|
								    usage
							 | 
						|
								fi
							 | 
						|
								
							 | 
						|
								# Function to get git tags sorted in reverse order
							 | 
						|
								git_tags() {
							 | 
						|
								    git tag -l | sort -rV
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Function to get git log between two tags
							 | 
						|
								git_log() {
							 | 
						|
								    local fromtag="$1"
							 | 
						|
								    local totag="$2"
							 | 
						|
								    git log --no-merges --oneline "${fromtag}...${totag}" 2>/dev/null
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Function to get author and time for a tag
							 | 
						|
								git_author_and_time() {
							 | 
						|
								    local tag="$1"
							 | 
						|
								    git log -1 --format="-- %an <%ae>  %cD" "$tag"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Function to get git version
							 | 
						|
								git_version() {
							 | 
						|
								    git describe --always --tags --dirty 2>/dev/null || echo "unknown"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Function to guess distribution
							 | 
						|
								guess_distro() {
							 | 
						|
								    if command -v lsb_release >/dev/null 2>&1; then
							 | 
						|
								        lsb_release -i -s 2>/dev/null | tr '[:upper:]' '[:lower:]'
							 | 
						|
								    else
							 | 
						|
								        echo "unknown"
							 | 
						|
								    fi
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Function to guess codename
							 | 
						|
								guess_codename() {
							 | 
						|
								    if command -v lsb_release >/dev/null 2>&1; then
							 | 
						|
								        lsb_release -c -s 2>/dev/null | tr '[:upper:]' '[:lower:]'
							 | 
						|
								    else
							 | 
						|
								        echo "unknown"
							 | 
						|
								    fi
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Handle guessing of values
							 | 
						|
								if [ "$DISTRO" = "::guess::" ]; then
							 | 
						|
								    DISTRO=$(guess_distro)
							 | 
						|
								fi
							 | 
						|
								
							 | 
						|
								if [ "$CODENAME" = "::guess::" ]; then
							 | 
						|
								    CODENAME=$(guess_codename)
							 | 
						|
								fi
							 | 
						|
								
							 | 
						|
								if [ "$VERSION" = "::guess::" ]; then
							 | 
						|
								    VERSION=$(git_version)
							 | 
						|
								fi
							 | 
						|
								
							 | 
						|
								# Version suffix
							 | 
						|
								VERSUFFIX="~${DISTRO}-${CODENAME}"
							 | 
						|
								
							 | 
						|
								# Get all tags
							 | 
						|
								TAGS=$(git_tags)
							 | 
						|
								
							 | 
						|
								# Create temporary file for tag pairs
							 | 
						|
								TMPFILE=$(mktemp)
							 | 
						|
								trap 'rm -f "$TMPFILE"' EXIT
							 | 
						|
								
							 | 
						|
								# Check if version is in tags
							 | 
						|
								if echo "$TAGS" | grep -q "^${VERSION}$"; then
							 | 
						|
								    # If version is a tag, start from that tag
							 | 
						|
								    echo "$TAGS" | awk -v ver="$VERSION" 'BEGIN{found=0} {if($0==ver)found=1; if(found)print}' > "$TMPFILE"
							 | 
						|
								else
							 | 
						|
								    # If version is not a tag, use HEAD as starting point
							 | 
						|
								    echo "$VERSION HEAD" > "$TMPFILE"
							 | 
						|
								    echo "$TAGS" >> "$TMPFILE"
							 | 
						|
								fi
							 | 
						|
								
							 | 
						|
								# Process tags and generate changelog
							 | 
						|
								PREV_TAG=""
							 | 
						|
								PREV_REF=""
							 | 
						|
								FIRST=1
							 | 
						|
								
							 | 
						|
								while IFS= read -r line; do
							 | 
						|
								    if [ -z "$line" ]; then
							 | 
						|
								        continue
							 | 
						|
								    fi
							 | 
						|
								
							 | 
						|
								    # Handle the special case of VERSION HEAD
							 | 
						|
								    if [ "$line" = "$VERSION HEAD" ]; then
							 | 
						|
								        TAG="$VERSION"
							 | 
						|
								        REF="HEAD"
							 | 
						|
								    else
							 | 
						|
								        TAG="$line"
							 | 
						|
								        REF="$line"
							 | 
						|
								    fi
							 | 
						|
								
							 | 
						|
								    if [ -n "$PREV_TAG" ]; then
							 | 
						|
								        # Get log entries between current and previous tag
							 | 
						|
								        LOG_ENTRIES=$(git_log "$REF" "$PREV_REF")
							 | 
						|
								
							 | 
						|
								        # Skip if no changes
							 | 
						|
								        if [ -z "$LOG_ENTRIES" ] || [ "$LOG_ENTRIES" = "" ]; then
							 | 
						|
								            PREV_TAG="$TAG"
							 | 
						|
								            PREV_REF="$REF"
							 | 
						|
								            continue
							 | 
						|
								        fi
							 | 
						|
								
							 | 
						|
								        # Print package header
							 | 
						|
								        printf "%s (%s%s) %s; urgency=%s\n\n" "$NAME" "$PREV_TAG" "$VERSUFFIX" "$CODENAME" "$URGENCY"
							 | 
						|
								
							 | 
						|
								        # Print each log entry
							 | 
						|
								        echo "$LOG_ENTRIES" | while IFS= read -r entry; do
							 | 
						|
								            if [ -n "$entry" ]; then
							 | 
						|
								                printf "  * %s\n" "$entry"
							 | 
						|
								            fi
							 | 
						|
								        done
							 | 
						|
								
							 | 
						|
								        # Print author and time
							 | 
						|
								        AUTHOR_TIME=$(git_author_and_time "$PREV_REF")
							 | 
						|
								        printf "\n %s\n\n" "$AUTHOR_TIME"
							 | 
						|
								    fi
							 | 
						|
								
							 | 
						|
								    PREV_TAG="$TAG"
							 | 
						|
								    PREV_REF="$REF"
							 | 
						|
								done < "$TMPFILE"
							 |