Your message dated Thu, 1 Jun 2023 10:51:56 +0200
with message-id <89374047-b66a-ef49-0741-3b6a96e92...@debian.org>
and subject line Re: Bug#1036914: unblock: librem5-flash-image/0.0.3-1
has caused the Debian Bug report #1036914,
regarding unblock: librem5-flash-image/0.0.3-1
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact ow...@bugs.debian.org
immediately.)


-- 
1036914: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1036914
Debian Bug Tracking System
Contact ow...@bugs.debian.org with problems
--- Begin Message ---
Package: release.debian.org
Severity: normal
User: release.debian....@packages.debian.org
Usertags: unblock
X-Debbugs-Cc: librem5-flash-im...@packages.debian.org
Control: affects -1 + src:librem5-flash-image

Please unblock package librem5-flash-image

The tool is used to flash images to Librem 5 phones.

[ Reason ]
This adds support for stable image downloads (rather than
always fetching the latest image to flash to the phone)
hence it seems appropriate to have that in a stable relase.
It also makes downloading a bit more robust by allowing for longer
timeouts.

[ Impact ]
Users will have to manually go out and search for stable images.

[ Tests ]
- Tested flashing manually
- CI tests (that download images) pass upstream in a Debian container

[ Risks ]
Risks should be low as the package is in use on other distros since some
time.

[ Checklist ]
  [x] all changes are documented in the d/changelog
  [x] I reviewed all changes and I approve them
  [x] attach debdiff against the package in testing

[ Other info ]
I apologize for being late here, I simply missed that the version
is outdated. I could have backported the patch but just using the
upstream version (which didn't bring any other features) seemed more
reasonable here.

unblock librem5-flash-image/0.0.3-1
diff --git a/debian/changelog b/debian/changelog
index 2c0f47f..d94dbf9 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+librem5-flash-image (0.0.3-1) unstable; urgency=medium
+
+  * New upstream release
+
+ -- Guido Günther <a...@sigxcpu.org>  Fri, 24 Feb 2023 17:53:10 +0100
+
 librem5-flash-image (0.0.2-1) unstable; urgency=medium
 
   * New upstream release 0.0.2
diff --git a/debian/gbp.conf b/debian/gbp.conf
index 3d0bb65..b2eeae8 100644
--- a/debian/gbp.conf
+++ b/debian/gbp.conf
@@ -1,4 +1,17 @@
 [DEFAULT]
-debian-branch=debian/master
+debian-branch = debian/master
+debian-tag = debian/%(version)s
+upstream-branch = upstream/latest
+upstream-tag = upstream/%(version)s
+upstream-vcs-tag = v%(version)s
 pristine-tar = True
-upstream-tag = v%(version)s
+
+[tag]
+sign-tags = true
+
+[dch]
+multimaint-merge = True
+
+[import-orig]
+postimport = dch -v%(version)s New upstream release; git add debian/changelog; debcommit
+upstream-vcs-tag = v%(version%~%_)s
diff --git a/scripts/librem5-flash-image b/scripts/librem5-flash-image
index be28869..3896d8c 100755
--- a/scripts/librem5-flash-image
+++ b/scripts/librem5-flash-image
@@ -35,6 +35,12 @@ except ImportError:
 
 from urllib.parse import urljoin
 
+IMAGES = {
+    'stable': {
+        'url': 'https://storage.puri.sm/librem5/images/',
+    }
+}
+
 JENKINS = 'https://arm01.puri.sm'
 BOARD_TYPE = 'librem5r4'
 VALID_PHONE_BOARD_TYPES = ['librem5r2', 'librem5r3', 'librem5r4']
@@ -130,7 +136,8 @@ def resuming_stream(url, expected_size, max_attempts):
         try:
             resp = requests.get(url,
                                 stream=True,
-                                headers={'Range': 'bytes={}-'.format(position)}
+                                headers={'Range': 'bytes={}-'.format(position)},
+                                timeout=10
                                 )
             resp.raise_for_status()
 
@@ -145,7 +152,9 @@ def resuming_stream(url, expected_size, max_attempts):
             if position < expected_size:
                 raise PrematureEndException()
             return
-        except (requests.exceptions.ConnectionError, PrematureEndException):
+        except (requests.exceptions.ConnectionError,
+                requests.exceptions.Timeout,
+                PrematureEndException):
             if i == max_attempts - 1:
                 logging.error("Max connection errors reached, aborting")
                 raise
@@ -207,7 +216,7 @@ def download_image(url, target, attempts):
     verify_image(target, meta)
 
 
-def find_image(jobname, type, variant, dist):
+def find_image_jenkins(jobname, type, variant, dist):
     server = jenkins.Jenkins(JENKINS)
     logging.info("Looking for {} {} {} image".format(type, variant, dist))
     try:
@@ -219,6 +228,8 @@ def find_image(jobname, type, variant, dist):
         resp = requests.get(build['url'] + '/api/json')
         resp.raise_for_status()
         json = resp.json()
+        if json['description'] is None:
+            continue
         if (json['description'].startswith(variant + ' ' + type) and
                 dist in json['description'] and
                 json['result'] == 'SUCCESS'):
@@ -229,6 +240,40 @@ def find_image(jobname, type, variant, dist):
     return found
 
 
+def find_image_stable(board, variant, dist):
+    remote = IMAGES['stable']
+    logging.info("Looking for {} {} {} image".format(board, variant, dist))
+    found = None
+
+    path = f"{dist}/latest/{board}/{variant}/"
+    url = urljoin(remote['url'], f"{path}/artifact/{IMAGE.format(board)}.xz")
+    try:
+        resp = requests.head(url, timeout=10)
+        if resp.ok:
+            d = datetime.datetime.strptime(resp.headers['Last-Modified'],
+                                           '%a, %d %b %Y %H:%M:%S %Z')
+            return {
+                'url': urljoin(remote['url'], path),
+                'timestamp': d.timestamp() * 1000,
+                'id': '"stable"',
+                'description': f"Last stable {board} build",
+            }
+        resp.raise_for_status()
+
+    except (requests.exceptions.ConnectionError,
+            requests.exceptions.Timeout):
+        logging.error("Failed to find image at {} - connection failed".format(url))
+        found = None
+    return found
+
+
+def find_image(jobname, board, variant, dist, stable):
+    if stable:
+        return find_image_stable(board, variant, dist)
+    else:
+        return find_image_jenkins(jobname, board, variant, dist)
+
+
 def find_uboot(jobname):
     server = jenkins.Jenkins(JENKINS)
 
@@ -378,6 +423,8 @@ def main():
     parser.add_argument('--board', choices=VALID_DEVKIT_BOARD_TYPES + VALID_PHONE_BOARD_TYPES, default=None,
                         help="Type of the board to download ( devkit, librem5r2, librem5r3, librem5r4 ) "
                         "default is 'auto'")
+    parser.add_argument('--stable', action='store_true', default=False,
+                        help="Whether to grab the latest stable image, otherwise the dev snapshot is fetched")
 
     group = parser.add_argument_group(title='Testing and debugging options')
     group.add_argument('--debug', action="store_true", default=False,
@@ -405,7 +452,7 @@ def main():
 
     # Check available downloads upfront so it's less likely we fail
     # later:
-    image_ref = find_image(args.image_job, board, args.variant, args.dist)
+    image_ref = find_image(args.image_job, board, args.variant, args.dist, args.stable)
     if image_ref:
         image_ref['ts'] = datetime.datetime.fromtimestamp(image_ref['timestamp'] / 1000).strftime('%c')
         logging.info("Found disk image Build {id} '{description}' from {ts}".format(**image_ref))
@@ -431,7 +478,8 @@ def main():
     if board in ["librem5r3", 'librem5r4']:
         uuu_mods = "CFG: SDP: -chip MX8MQ -compatible MX8MQ -vid 0x316d -pid 0x4c05"
 
-    outdir = args.dir if args.dir is not None else tempfile.mkdtemp(prefix='devkit_image_', dir='.')
+    dirprefix = 'tmp_' + os.path.basename(sys.argv[0]) + '_'
+    outdir = args.dir if args.dir is not None else tempfile.mkdtemp(prefix=dirprefix, dir='.')
     try:
         logging.info("Downloading to {}".format(outdir))
         if args.dir == outdir:

--- End Message ---
--- Begin Message ---
Hi,

On 29-05-2023 13:15, Guido Günther wrote:
I could have backported the patch but just using the
upstream version (which didn't bring any other features) seemed more
reasonable here.

I understand this to read: this *is* a targeted fix. Please take more care about timing in the next release cycle for your packages, and it helps to file the unblock request earlier (after upload). Technically your request came after the deadline.

Also, that diff looked like a lot of copy/paste, but it's not up to me to judge coding style ;)

unblock librem5-flash-image/0.0.3-1

Anyways, unblocked.

Paul

Attachment: OpenPGP_signature
Description: OpenPGP digital signature


--- End Message ---

Reply via email to