Initial release
This commit is contained in:
commit
9662a39abd
3 changed files with 284 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
*~
|
56
README.md
Normal file
56
README.md
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
# gitdch
|
||||||
|
|
||||||
|
Simple python script using GitPython library to generate debian
|
||||||
|
changelog file from git commit history. Each existing tags is
|
||||||
|
considered as a release version and current working version is
|
||||||
|
numbered using ''git describe --tags'' command.
|
||||||
|
|
||||||
|
# Installation
|
||||||
|
```
|
||||||
|
apt install git python3-git
|
||||||
|
git clone https://gogs.zionetrix.net/bn8/gitdch.git /usr/local/src/gitdch
|
||||||
|
ln -s /usr/local/src/gitdch/gitdch /usr/local/bin/gitdch
|
||||||
|
```
|
||||||
|
|
||||||
|
# Usage
|
||||||
|
```
|
||||||
|
usage: gitdch [-h] [-d] [-v] [-w] [-l LOGFILE] [-q] [-p GIT_PATH] [-o OUTPUT] [-n PACKAGE_NAME] [-V VERSION] [--version-suffix VERSION_SUFFIX] [-c CODE_NAME] [-u URGENCY]
|
||||||
|
|
||||||
|
Generate Debian package changelog from git
|
||||||
|
|
||||||
|
optional arguments:
|
||||||
|
-h, --help show this help message and exit
|
||||||
|
-d, --debug Show debug messages
|
||||||
|
-v, --verbose Show verbose messages
|
||||||
|
-w, --warning Show warning messages
|
||||||
|
-l LOGFILE, --log-file LOGFILE
|
||||||
|
Log file path
|
||||||
|
-q, --quiet Quiet mode: do not log on console (only if log file is provided)
|
||||||
|
-p GIT_PATH, --path GIT_PATH
|
||||||
|
Git repository path (default: ./)
|
||||||
|
-o OUTPUT, --output OUTPUT
|
||||||
|
Generated Debian changelog output path (default: stdout)
|
||||||
|
-n PACKAGE_NAME, --package-name PACKAGE_NAME
|
||||||
|
Package name
|
||||||
|
-V VERSION, --version VERSION
|
||||||
|
Currrent version (default: autodetected using git describe --tags)
|
||||||
|
--version-suffix VERSION_SUFFIX
|
||||||
|
Suffix for autodetected version
|
||||||
|
-c CODE_NAME, --code-name CODE_NAME
|
||||||
|
Debian code name (default: unstable)
|
||||||
|
-u URGENCY, --urgency URGENCY
|
||||||
|
Package urgency (default: medium)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Copyright
|
||||||
|
|
||||||
|
Copyright (c) 2013-2022 Benjamin Renard <brenard@zionetrix.net>
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 3 as published by the Free Software Foundation.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
227
gitdch
Executable file
227
gitdch
Executable file
|
@ -0,0 +1,227 @@
|
||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
""" Generate Debian package changelog from git """
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
|
||||||
|
import git
|
||||||
|
|
||||||
|
default_git_path = './'
|
||||||
|
default_code_name = 'unstable'
|
||||||
|
default_urgency = 'medium'
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser(description=__doc__)
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
'-d', '--debug',
|
||||||
|
action='store_true',
|
||||||
|
help='Show debug messages'
|
||||||
|
)
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
'-v', '--verbose',
|
||||||
|
action='store_true',
|
||||||
|
help='Show verbose messages'
|
||||||
|
)
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
'-w', '--warning',
|
||||||
|
action='store_true',
|
||||||
|
help='Show warning messages'
|
||||||
|
)
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
'-l',
|
||||||
|
'--log-file',
|
||||||
|
action="store",
|
||||||
|
type=str,
|
||||||
|
dest="logfile",
|
||||||
|
help="Log file path"
|
||||||
|
)
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
'-q', '--quiet',
|
||||||
|
action='store_true',
|
||||||
|
help='Quiet mode: do not log on console (only if log file is provided)'
|
||||||
|
)
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
'-p',
|
||||||
|
'--path',
|
||||||
|
type=str,
|
||||||
|
dest='git_path',
|
||||||
|
help='Git repository path (default: %s)' % default_git_path,
|
||||||
|
default=default_git_path
|
||||||
|
)
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
'-o',
|
||||||
|
'--output',
|
||||||
|
type=str,
|
||||||
|
dest='output',
|
||||||
|
help='Generated Debian changelog output path (default: stdout)',
|
||||||
|
)
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
'-n',
|
||||||
|
'--package-name',
|
||||||
|
type=str,
|
||||||
|
dest='package_name',
|
||||||
|
help='Package name'
|
||||||
|
)
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
'-V',
|
||||||
|
'--version',
|
||||||
|
type=str,
|
||||||
|
dest='version',
|
||||||
|
help='Currrent version (default: autodetected using git describe --tags)'
|
||||||
|
)
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
'--version-suffix',
|
||||||
|
type=str,
|
||||||
|
dest='version_suffix',
|
||||||
|
help='Suffix for autodetected version'
|
||||||
|
)
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
'-c',
|
||||||
|
'--code-name',
|
||||||
|
type=str,
|
||||||
|
dest='code_name',
|
||||||
|
help='Debian code name (default: %s)' % default_code_name,
|
||||||
|
default=default_code_name
|
||||||
|
)
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
'-u',
|
||||||
|
'--urgency',
|
||||||
|
type=str,
|
||||||
|
dest='urgency',
|
||||||
|
help='Package urgency (default: %s)' % default_urgency,
|
||||||
|
default=default_urgency
|
||||||
|
)
|
||||||
|
|
||||||
|
options = parser.parse_args()
|
||||||
|
|
||||||
|
if not options.package_name:
|
||||||
|
parser.error(
|
||||||
|
'You must provide package name using -n/--package-name paramter')
|
||||||
|
|
||||||
|
# Initialize log
|
||||||
|
log = logging.getLogger()
|
||||||
|
logformat = logging.Formatter(
|
||||||
|
"%(asctime)s - {0} - %(levelname)s : %(message)s".format(
|
||||||
|
os.path.basename(sys.argv[0])
|
||||||
|
)
|
||||||
|
)
|
||||||
|
# Set root logger to DEBUG (filtering done by handlers)
|
||||||
|
log.setLevel(logging.DEBUG)
|
||||||
|
|
||||||
|
log_level = None
|
||||||
|
if options.debug:
|
||||||
|
log_level = logging.DEBUG
|
||||||
|
elif options.verbose:
|
||||||
|
log_level = logging.INFO
|
||||||
|
elif options.warning:
|
||||||
|
log_level = logging.WARNING
|
||||||
|
|
||||||
|
if options.logfile:
|
||||||
|
logfile = logging.FileHandler(options.logfile)
|
||||||
|
logfile.setFormatter(logformat)
|
||||||
|
logfile.setLevel(log_level if log_level is not None else logging.INFO)
|
||||||
|
log.addHandler(logfile)
|
||||||
|
|
||||||
|
if not options.quiet or not options.logfile:
|
||||||
|
logconsole = logging.StreamHandler()
|
||||||
|
logconsole.setLevel(log_level if log_level is not None else logging.FATAL)
|
||||||
|
logconsole.setFormatter(logformat)
|
||||||
|
log.addHandler(logconsole)
|
||||||
|
|
||||||
|
repo = git.Repo(options.git_path)
|
||||||
|
|
||||||
|
log.info('Generate changelog from git commits')
|
||||||
|
|
||||||
|
versions = []
|
||||||
|
tag_commits = dict(
|
||||||
|
(tag.commit.binsha, tag)
|
||||||
|
for tag in repo.tags
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def clean_deb_version(version_name):
|
||||||
|
""" Clean debian version name """
|
||||||
|
version_name = re.sub('^[^0-9]*', '', version_name)
|
||||||
|
if options.version_suffix:
|
||||||
|
version_name += options.version_suffix
|
||||||
|
return version_name
|
||||||
|
|
||||||
|
|
||||||
|
def add_version():
|
||||||
|
""" Add version info """
|
||||||
|
if messages:
|
||||||
|
log.info('Add version %s:\n - %s', version, '\n - '.join(messages))
|
||||||
|
versions.append({
|
||||||
|
'name': version,
|
||||||
|
'tag': tag,
|
||||||
|
'commit': version_commit,
|
||||||
|
'messages': messages,
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
tag = None
|
||||||
|
version_commit = None
|
||||||
|
version = options.version or clean_deb_version(repo.git.describe('--tags'))
|
||||||
|
messages = []
|
||||||
|
for commit in repo.iter_commits():
|
||||||
|
if version_commit is None:
|
||||||
|
version_commit = commit
|
||||||
|
log.debug('Commit %s', commit)
|
||||||
|
if commit.binsha in tag_commits:
|
||||||
|
new_tag = tag_commits[commit.binsha]
|
||||||
|
log.debug('Reach new tag %s', new_tag)
|
||||||
|
|
||||||
|
add_version()
|
||||||
|
|
||||||
|
tag = new_tag
|
||||||
|
version = clean_deb_version(tag.name)
|
||||||
|
version_commit = commit
|
||||||
|
messages = []
|
||||||
|
log.debug('Iter commits for version %s')
|
||||||
|
messages.append(commit.summary)
|
||||||
|
add_version()
|
||||||
|
log.info('%d versions found', len(versions))
|
||||||
|
|
||||||
|
changelog_lines = []
|
||||||
|
for version in versions:
|
||||||
|
changelog_lines.append(
|
||||||
|
'{package} ({version}-1) {code_name}; urgency={urgency}\n\n'.format(
|
||||||
|
package=options.package_name,
|
||||||
|
version=version['name'],
|
||||||
|
code_name=options.code_name,
|
||||||
|
urgency=options.urgency
|
||||||
|
)
|
||||||
|
)
|
||||||
|
for message in version['messages']:
|
||||||
|
changelog_lines.append(' * {0}\n'.format(message))
|
||||||
|
|
||||||
|
changelog_lines.append(
|
||||||
|
"\n -- {name} <{email}> {date}\n\n".format(
|
||||||
|
name=version['commit'].author.name,
|
||||||
|
email=version['commit'].author.email,
|
||||||
|
date=version['commit'].committed_datetime.strftime(
|
||||||
|
"%a, %d %b %Y %H:%M:%S %z")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
if options.output:
|
||||||
|
log.info('Write generated Debian changelog in file %s', options.output)
|
||||||
|
with open(options.output, 'w') as fd:
|
||||||
|
fd.writelines(changelog_lines)
|
||||||
|
else:
|
||||||
|
print(''.join(changelog_lines))
|
Loading…
Reference in a new issue