Split out patch status read to a method on the Patch model

Make it easier to call this outside of the context of the update
process.

Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
This commit is contained in:
Paul Eggleton 2018-10-02 10:49:02 +13:00
parent ce5141fc39
commit f9c5143700
2 changed files with 30 additions and 26 deletions

View File

@ -15,6 +15,7 @@ from collections import namedtuple
import os.path import os.path
import re import re
import posixpath import posixpath
import codecs
from . import utils from . import utils
@ -541,6 +542,7 @@ class Source(models.Model):
def __str__(self): def __str__(self):
return '%s - %s - %s' % (self.recipe.layerbranch, self.recipe.pn, self.url) return '%s - %s - %s' % (self.recipe.layerbranch, self.recipe.pn, self.url)
patch_status_re = re.compile(r"^[\t ]*(Upstream[-_ ]Status:?)[\t ]*(\w+)([\t ]+.*)?", re.IGNORECASE | re.MULTILINE)
class Patch(models.Model): class Patch(models.Model):
PATCH_STATUS_CHOICES = [ PATCH_STATUS_CHOICES = [
@ -565,6 +567,33 @@ class Patch(models.Model):
url = self.recipe.layerbranch.file_url(self.path) url = self.recipe.layerbranch.file_url(self.path)
return url or '' return url or ''
def read_status_from_file(self, patchfn, logger=None):
for encoding in ['utf-8', 'latin-1']:
try:
with codecs.open(patchfn, 'r', encoding=encoding) as f:
for line in f:
line = line.rstrip()
if line.startswith('Index: ') or line.startswith('diff -') or line.startswith('+++ '):
break
res = patch_status_re.match(line)
if res:
status = res.group(2).lower()
for key, value in dict(Patch.PATCH_STATUS_CHOICES).items():
if status == value.lower():
self.status = key
if res.group(3):
self.status_extra = res.group(3).strip()
break
else:
if logger:
logger.warn('Invalid upstream status in %s: %s' % (patchfn, line))
except UnicodeDecodeError:
continue
break
else:
if logger:
logger.error('Unable to find suitable encoding to read patch %s' % patchfn)
def __str__(self): def __str__(self):
return "%s - %s" % (self.recipe, self.src_path) return "%s - %s" % (self.recipe, self.src_path)

View File

@ -17,7 +17,6 @@ import re
import tempfile import tempfile
import shutil import shutil
import errno import errno
import codecs
from distutils.version import LooseVersion from distutils.version import LooseVersion
import itertools import itertools
import utils import utils
@ -57,8 +56,6 @@ def split_recipe_fn(path):
pv = "1.0" pv = "1.0"
return (pn, pv) return (pn, pv)
patch_status_re = re.compile(r"^[\t ]*(Upstream[-_ ]Status:?)[\t ]*(\w+)([\t ]+.*)?", re.IGNORECASE | re.MULTILINE)
def collect_patch(recipe, patchfn, layerdir_start, stop_on_error): def collect_patch(recipe, patchfn, layerdir_start, stop_on_error):
from django.db import DatabaseError from django.db import DatabaseError
from layerindex.models import Patch from layerindex.models import Patch
@ -68,29 +65,7 @@ def collect_patch(recipe, patchfn, layerdir_start, stop_on_error):
patchrec.path = os.path.relpath(patchfn, layerdir_start) patchrec.path = os.path.relpath(patchfn, layerdir_start)
patchrec.src_path = os.path.relpath(patchrec.path, recipe.filepath) patchrec.src_path = os.path.relpath(patchrec.path, recipe.filepath)
try: try:
for encoding in ['utf-8', 'latin-1']: patchrec.read_status_from_file(patchfn, logger)
try:
with codecs.open(patchfn, 'r', encoding=encoding) as f:
for line in f:
line = line.rstrip()
if line.startswith('Index: ') or line.startswith('diff -') or line.startswith('+++ '):
break
res = patch_status_re.match(line)
if res:
status = res.group(2).lower()
for key, value in dict(Patch.PATCH_STATUS_CHOICES).items():
if status == value.lower():
patchrec.status = key
if res.group(3):
patchrec.status_extra = res.group(3).strip()
break
else:
logger.warn('Invalid upstream status in %s: %s' % (patchfn, line))
except UnicodeDecodeError:
continue
break
else:
logger.error('Unable to find suitable encoding to read patch %s' % patchfn)
patchrec.save() patchrec.save()
except DatabaseError: except DatabaseError:
raise raise