--- Begin Message ---
Package: src:git-buildpackage
Version: 0.9.20
Severity: wishlist
Tags: patch
Feature request:
`gbp import-orig` should strip [~+](dfsg|ds).* or even [~+].* from the
upstream version (only) when calculating the upstream-vcs-tag.
Details:
I'm trying to get `gbp import-orig --uscan` working with a variant of
the repack-waf script from: https://wiki.debian.org/UnpackWaf
The example here is NTPsec 1.1.9.
The stock repack-waf script takes an input orig tarball of "1.1.9" and
outputs an orig tarball of "1.1.9+dfsg1". Unfortunately, in this state,
uscan is not aware that the tarball was repacked, so neither is `gbp
import-orig`. gbp gets the version from the tarball name, which it gets
from the <target> element in the `uscan --dehs` output.
If I add oversionmangle=s/$/+dfsg1/ to the opts in debian/watch, then
uscan is aware that the output will be 1.1.9+dfsg1. This seems like the
correct thing to do from uscan's perspective, as its man page says
oversionmangle "should be used to add a suffix such as +dfsg1".
However, uscan will also symlink the upstream orig tarball with that
name, so the stock repack-waf script breaks. That can easily be
addressed by changing repack-waf to use the 1.1.9+dfsg1 name as both
input and output, which I have done.
In that configuration, gbp gets the upstream version of 1.1.9+dfsg1.
This leads to tag names like upstream/1.1.9+dfsg1, which is what I have
been using so far. DEP-14 isn't clear whether it should be
upstream/1.1.9+dfsg1 or upstream/1.1.9. However, DEP-14 does
contemplate that "The upstream/<version> tag would be created by the
package maintainer when needed: for example when
it does a release based on a Git snapshot". So those tags are not
expected to correspond exactly with upstream's tags. I think they
should be the "Debian upstream version", so 1.1.9+dfsg1 is correct.
Further, in bug #546598, Charles Plessy <[email protected]> suggested
that `gbp import-orig --filter` should automatically add "~dfsg":
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=546598 That bug was
from 2009. Today, plessy seems to use +dfsg.1, +ds-1, and +dfsg-1
suffixes. More importantly than those minor differences in suffix
style, some of those packages currently have numbers greater than 1.
That to me shows that stripping the +dfsg1 to get just upstream/1.1.9
would be inappropriate, as that would not scale to +dfsg2 and beyond.
This is further evidence that upstream/1.1.9+dfsg1 is correct.
However, that still leaves one problem. The --upstream-vcs-tag tag
format only allows for one substitution which has to be a single
character substitution. There is no way to strip the +dfsg1. In my
case, I want to get to the NTPsec_1_1_9 format that upstream uses by
using: upstream-vcs-tag = NTPsec_%(version%.%_)s
I ran some queries against UDD to find various patterns. Based on that,
the attached patch series implements this and a bunch more. With this
change, I was able to import version 1.1.9 of NTPsec using:
gbp import-orig --uscan --upstream-vcs-tag="NTPsec_%(version%.%_)s"
The first patch is just a typo fix to a comment nearby. It's unrelated
to this change.
The second two patches are refactoring changes. Those can be squashed
together or into the last change, if you prefer. I included them to show
the refactoring steps individually, in case that helps you review this.
The third change is the meat of this. I have doctests, but I'm not sure
if those are automatically run or how I integrate them into the
git-buildpackage tests. I'm also not sure about the function name for
_upstream_version_from_debian_upstream(). In a previous version, I
called it _mangle_upstream_version().
--
Richard
From 7cc1195bac48833fa551102a114d943be2cc006b Mon Sep 17 00:00:00 2001
From: Richard Laager <[email protected]>
Date: Wed, 12 Aug 2020 21:54:06 -0500
Subject: [PATCH 1/4] import-orig: Fix a comment typo
---
gbp/deb/git.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gbp/deb/git.py b/gbp/deb/git.py
index 596c9ff..4b52122 100644
--- a/gbp/deb/git.py
+++ b/gbp/deb/git.py
@@ -171,7 +171,7 @@ class DebianGitRepository(PkgGitRepository):
@classmethod
def _mangle_version(cls, format, version):
"""
- Basic version mangling to replce single characters
+ Basic version mangling to replace single characters
>>> DebianGitRepository._mangle_version(r'%(version%-%\\%)s', "0-1.2.3")
('%(version)s', '0%1.2.3')
--
2.28.0
From 37904cdda6d4b1de4602bbf3e98baa8bb5ace42d Mon Sep 17 00:00:00 2001
From: Richard Laager <[email protected]>
Date: Wed, 12 Aug 2020 21:58:31 -0500
Subject: [PATCH 2/4] import-orig: Refactor vcs_tag_parent
This eliminates an indentation level.
---
gbp/deb/git.py | 13 ++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)
diff --git a/gbp/deb/git.py b/gbp/deb/git.py
index 4b52122..a701589 100644
--- a/gbp/deb/git.py
+++ b/gbp/deb/git.py
@@ -375,14 +375,13 @@ class DebianGitRepository(PkgGitRepository):
def vcs_tag_parent(self, vcs_tag_format, version):
"""If linking to the upstream VCS get the commit id"""
- if vcs_tag_format:
- try:
- tag = "%s^{}" % self.version_to_tag(vcs_tag_format, version)
- return [self.rev_parse(tag)]
- except GitRepositoryError:
- raise GitRepositoryError("Can't find upstream vcs tag at '%s'" % tag)
- else:
+ if not vcs_tag_format:
return None
+ try:
+ tag = "%s^{}" % self.version_to_tag(vcs_tag_format, version)
+ return [self.rev_parse(tag)]
+ except GitRepositoryError:
+ raise GitRepositoryError("Can't find upstream vcs tag at '%s'" % tag)
# vim:et:ts=4:sw=4:et:sts=4:ai:set list listchars=tab\:»·,trail\:·:
--
2.28.0
From 8e676bebed16c46639ce50adcf52646679746c54 Mon Sep 17 00:00:00 2001
From: Richard Laager <[email protected]>
Date: Wed, 12 Aug 2020 21:59:23 -0500
Subject: [PATCH 3/4] import-orig: Refactor vcs_tag_parent
This makes the "tag" variable just the tag. This improves the
human-readability of the error message if the tag cannot be found.
---
gbp/deb/git.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/gbp/deb/git.py b/gbp/deb/git.py
index a701589..4a17c2d 100644
--- a/gbp/deb/git.py
+++ b/gbp/deb/git.py
@@ -378,8 +378,8 @@ class DebianGitRepository(PkgGitRepository):
if not vcs_tag_format:
return None
try:
- tag = "%s^{}" % self.version_to_tag(vcs_tag_format, version)
- return [self.rev_parse(tag)]
+ tag = self.version_to_tag(vcs_tag_format, version)
+ return [self.rev_parse("%s^{}" % tag)]
except GitRepositoryError:
raise GitRepositoryError("Can't find upstream vcs tag at '%s'" % tag)
--
2.28.0
From 1c8f2acbcbd3ccf14dc4d7bd99b4d1e92e4c1574 Mon Sep 17 00:00:00 2001
From: Richard Laager <[email protected]>
Date: Wed, 12 Aug 2020 22:03:18 -0500
Subject: [PATCH 4/4] import-orig: Parse various Debian version patterns
This parses common Debian version patterns into the upstream version.
For example, 1.1.8+dfsg1 becomes 1.1.8. This strips epochs, handles the
+really convention, finds git revisions, and strips other + or ~
patterns.
---
gbp/deb/git.py | 59 +++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 56 insertions(+), 3 deletions(-)
diff --git a/gbp/deb/git.py b/gbp/deb/git.py
index 4a17c2d..a5367f4 100644
--- a/gbp/deb/git.py
+++ b/gbp/deb/git.py
@@ -129,6 +129,57 @@ class DebianGitRepository(PkgGitRepository):
version = "%s:%s" % (epoch, version)
return version
+ @classmethod
+ def _upstream_version_from_debian_upstream(cls, version):
+ """
+ Convert a Debian upstream version to an upstream version.
+ >>> DebianGitRepository._upstream_version_from_debian_upstream(
+ ... "1.1.8+dfsg1")
+ ('1.1.8', None)
+ >>> DebianGitRepository._upstream_version_from_debian_upstream(
+ ... "1:5.5.0~dfsg")
+ ('5.5.0', None)
+ >>> DebianGitRepository._upstream_version_from_debian_upstream(
+ ... "0.0~git20160722.0.0cdb66a")
+ (None, '0cdb66a')
+ >>> DebianGitRepository._upstream_version_from_debian_upstream(
+ ... "3:6.04~git20190206.bf6db5b4+dfsg1")
+ (None, 'bf6db5b4')
+ >>> DebianGitRepository._upstream_version_from_debian_upstream(
+ ... "2.3+really2.2")
+ ('2.2', None)
+ >>> DebianGitRepository._upstream_version_from_debian_upstream(
+ ... "4.99.4+dfsg+really4.10.0+py3")
+ ('4.10.0', None)
+ >>> DebianGitRepository._upstream_version_from_debian_upstream(
+ ... "5.4.1+really5.4.1~repack")
+ ('5.4.1', None)
+ >>> DebianGitRepository._upstream_version_from_debian_upstream(
+ ... "0.0~git20190103.40eba7e+really0.0~git20181023.b4e2780")
+ (None, 'b4e2780')
+ >>> DebianGitRepository._upstream_version_from_debian_upstream(
+ ... "1.1.0+really1.0.0+git20181028.94f6ae3")
+ (None, '94f6ae3')
+ """
+
+ # If version starts with an epoch, remove it.
+ m = re.search(r'^[0-9]+:(.*)', version)
+ if m:
+ version = m.group(1)
+
+ # If version has "really", keep the version starting after "really".
+ m = re.search(r'really(.*)', version)
+ if m:
+ version = m.group(1)
+
+ # If version matches a git snapshot pattern, return the git revision.
+ m = re.search(r'[~+]git[0-9]{8}(\.[0-9]+)?\.([0-9a-f]+)', version)
+ if m:
+ return (None, m.group(2))
+
+ # Strip off anything starting with [+~] and return the rest.
+ return (re.split(r'[+~]', version)[0], None)
+
@staticmethod
def _build_legacy_tag(format, version):
"""
@@ -377,11 +428,13 @@ class DebianGitRepository(PkgGitRepository):
"""If linking to the upstream VCS get the commit id"""
if not vcs_tag_format:
return None
+ (version, revision) = self._upstream_version_from_debian_upstream(version)
try:
- tag = self.version_to_tag(vcs_tag_format, version)
- return [self.rev_parse("%s^{}" % tag)]
+ if not revision:
+ revision = self.version_to_tag(vcs_tag_format, version)
+ return [self.rev_parse("%s^{}" % revision)]
except GitRepositoryError:
- raise GitRepositoryError("Can't find upstream vcs tag at '%s'" % tag)
+ raise GitRepositoryError("Can't find upstream vcs tag/revision at '%s'" % revision)
# vim:et:ts=4:sw=4:et:sts=4:ai:set list listchars=tab\:»·,trail\:·:
--
2.28.0
signature.asc
Description: OpenPGP digital signature
--- End Message ---