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"
 |