summaryrefslogtreecommitdiff
path: root/pkg/private/deb/make_deb.py
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/private/deb/make_deb.py')
-rw-r--r--pkg/private/deb/make_deb.py51
1 files changed, 36 insertions, 15 deletions
diff --git a/pkg/private/deb/make_deb.py b/pkg/private/deb/make_deb.py
index 9e2e5c5..9d10c4b 100644
--- a/pkg/private/deb/make_deb.py
+++ b/pkg/private/deb/make_deb.py
@@ -14,6 +14,7 @@
"""A simple cross-platform helper to create a debian package."""
import argparse
+from enum import Enum
import gzip
import hashlib
import io
@@ -30,6 +31,8 @@ else:
from pkg.private import helpers
+Multiline = Enum('Multiline', ['NO', 'YES', 'YES_ADD_NEWLINE'])
+
# list of debian fields : (name, mandatory, is_multiline[, default])
# see http://www.debian.org/doc/debian-policy/ch-controlfields.html
@@ -118,7 +121,7 @@ def AddArFileEntry(fileobj, filename,
fileobj.write(b'\n') # 2-byte alignment padding
-def MakeDebianControlField(name: str, value: str, is_multiline:bool=False) -> str:
+def MakeDebianControlField(name: str, value: str, multiline:Multiline=Multiline.NO) -> str:
"""Add a field to a debian control file.
https://www.debian.org/doc/debian-policy/ch-controlfields.html#syntax-of-control-files
@@ -132,15 +135,20 @@ def MakeDebianControlField(name: str, value: str, is_multiline:bool=False) -> st
if isinstance(value, list):
value = u', '.join(value)
value = value.rstrip()
- if not is_multiline:
+ if multiline == Multiline.NO:
value = value.strip()
if '\n' in value:
raise ValueError(
'\\n is not allowed in simple control fields (%s)' % value)
lines = value.split('\n')
- result = name + ': ' +lines[0].strip() + '\n'
- for line in lines[1:]:
+ i = 0
+ if multiline != Multiline.YES_ADD_NEWLINE:
+ result = name + ': ' + lines[i].strip() + '\n'
+ i = 1
+ else:
+ result = name + ':\n'
+ for line in lines[i:]:
if not line.startswith(' '):
result += ' '
result += line
@@ -155,10 +163,10 @@ def CreateDebControl(extrafiles=None, **kwargs):
for values in DEBIAN_FIELDS:
fieldname = values[0]
mandatory = values[1]
- is_multiline = values[2]
+ multiline = Multiline.YES if values[2] else Multiline.NO
key = fieldname[0].lower() + fieldname[1:].replace('-', '')
if mandatory or (key in kwargs and kwargs[key]):
- controlfile += MakeDebianControlField(fieldname, kwargs[key], is_multiline)
+ controlfile += MakeDebianControlField(fieldname, kwargs[key], multiline)
# Create the control.tar file
tar = io.BytesIO()
with gzip.GzipFile('control.tar.gz', mode='w', fileobj=tar, mtime=0) as gz:
@@ -190,6 +198,7 @@ def CreateDeb(output,
templates=None,
triggers=None,
conffiles=None,
+ changelog=None,
**kwargs):
"""Create a full debian package."""
extrafiles = OrderedDict()
@@ -209,6 +218,8 @@ def CreateDeb(output,
extrafiles['triggers'] = (triggers, 0o644)
if conffiles:
extrafiles['conffiles'] = ('\n'.join(conffiles) + '\n', 0o644)
+ if changelog:
+ extrafiles['changelog'] = (changelog, 0o644)
control = CreateDebControl(extrafiles=extrafiles, **kwargs)
# Write the final AR archive (the deb package)
@@ -226,7 +237,7 @@ def CreateDeb(output,
ext = 'tar.bz2'
else:
ext = '.'.join(ext)
- if ext not in ['tar.bz2', 'tar.gz', 'tar.xz', 'tar.lzma']:
+ if ext not in ['tar.bz2', 'tar.gz', 'tar.xz', 'tar.lzma', 'tar.zst']:
ext = 'tar'
data_size = os.stat(data).st_size
with open(data, 'rb') as datafile:
@@ -280,7 +291,7 @@ def CreateChanges(output,
changesdata = u''.join([
MakeDebianControlField('Format', '1.8'),
- MakeDebianControlField('Date', time.ctime(timestamp)),
+ MakeDebianControlField('Date', time.asctime(time.gmtime(timestamp))),
MakeDebianControlField('Source', package),
MakeDebianControlField('Binary', package),
MakeDebianControlField('Architecture', architecture),
@@ -290,21 +301,27 @@ def CreateChanges(output,
MakeDebianControlField('Maintainer', maintainer),
MakeDebianControlField('Changed-By', maintainer),
# The description in the changes file is strange
- 'Description:\n %s - %s\n' % (package, description.split('\n')[0]),
+ MakeDebianControlField('Description', (
+ '%s - %s\n') % (
+ package, description.split('\n')[0]),
+ multiline=Multiline.YES_ADD_NEWLINE),
MakeDebianControlField('Changes', (
- '\n %s (%s) %s; urgency=%s'
+ '%s (%s) %s; urgency=%s'
'\n Changes are tracked in revision control.') % (
package, version, distribution, urgency),
- is_multiline=True),
+ multiline=Multiline.YES_ADD_NEWLINE),
MakeDebianControlField(
- 'Files', '\n ' + ' '.join(
- [checksums['md5'], debsize, section, priority, deb_basename])),
+ 'Files', ' '.join(
+ [checksums['md5'], debsize, section, priority, deb_basename]),
+ multiline=Multiline.YES_ADD_NEWLINE),
MakeDebianControlField(
'Checksums-Sha1',
- '\n ' + ' '.join([checksums['sha1'], debsize, deb_basename])),
+ ' '.join([checksums['sha1'], debsize, deb_basename]),
+ multiline=Multiline.YES_ADD_NEWLINE),
MakeDebianControlField(
'Checksums-Sha256',
- '\n ' + ' '.join([checksums['sha256'], debsize, deb_basename]))
+ ' '.join([checksums['sha256'], debsize, deb_basename]),
+ multiline=Multiline.YES_ADD_NEWLINE)
])
with open(output, 'wb') as changes_fh:
changes_fh.write(changesdata.encode('utf-8'))
@@ -353,6 +370,9 @@ def main():
parser.add_argument(
'--conffile', action='append',
help='List of conffiles (prefix item with @ to provide a path)')
+ parser.add_argument(
+ '--changelog',
+ help='The changelog file (prefix item with @ to provide a path).')
AddControlFlags(parser)
options = parser.parse_args()
@@ -367,6 +387,7 @@ def main():
templates=helpers.GetFlagValue(options.templates, False),
triggers=helpers.GetFlagValue(options.triggers, False),
conffiles=GetFlagValues(options.conffile),
+ changelog=helpers.GetFlagValue(options.changelog, False),
package=options.package,
version=helpers.GetFlagValue(options.version),
description=helpers.GetFlagValue(options.description),