prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  At least a single resource for support or contact should be required
  This is simply asking us for trouble. No repo. No website. Nothing. The app was provided only over an archive on Google Drive (https://github.com/nextcloud/app-certificate-requests/pull/52) ... this is not offending developers, google drive or anything 😅 But - you know what I mean I hope 😢 
  
  <img width="919" alt="bildschirmfoto 2017-03-01 um 11 44 38" src="https://cloud.githubusercontent.com/assets/19711361/23456641/8c1a9b1c-fe74-11e6-9894-e0fec0f622e7.png">
  At least a single resource for support or contact should be required
  This is simply asking us for trouble. No repo. No website. Nothing. The app was provided only over an archive on Google Drive (https://github.com/nextcloud/app-certificate-requests/pull/52) ... this is not offending developers, google drive or anything 😅 But - you know what I mean I hope 😢 
  
  <img width="919" alt="bildschirmfoto 2017-03-01 um 11 44 38" src="https://cloud.githubusercontent.com/assets/19711361/23456641/8c1a9b1c-fe74-11e6-9894-e0fec0f622e7.png">
  
  --- END ISSUE ---
  
  Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
  --- BEGIN FILES ---
  Path: `nextcloudappstore/core/scaffolding/forms.py`
  Content:
  ```
  1 import re
  2 from os import listdir
  3 
  4 from django.core.exceptions import ValidationError
  5 from django.forms import Textarea, Form, URLField, MultipleChoiceField
  6 from django.utils.translation import ugettext_lazy as _  # type: ignore
  7 from django.forms.fields import EmailField, CharField, ChoiceField
  8 from django.conf import settings
  9 
  10 from nextcloudappstore.core.facades import resolve_file_relative_path
  11 from nextcloudappstore.core.models import Category
  12 from django.utils.functional import lazy
  13 
  14 
  15 def get_categories():
  16     return [(cat.id, cat.name) for cat in Category.objects.all()]
  17 
  18 
  19 def get_versions():
  20     tpls = listdir(resolve_file_relative_path(__file__, 'app-templates'))
  21     return [(v, v) for v in tpls]
  22 
  23 
  24 def validate_id(input: str) -> str:
  25     regex = r'^([A-Z][a-z]*)+$'
  26     if not re.match(regex, input):
  27         raise ValidationError(_('The app name must be camel case e.g. MyApp'))
  28 
  29 
  30 class AppScaffoldingForm(Form):
  31     name = CharField(max_length=80, label=_('App name'),
  32                      validators=[validate_id],
  33                      help_text=_('The app name must be camel case e.g. MyApp'))
  34     platform = ChoiceField(choices=lazy(get_versions, list), required=True,
  35                            label=_('Nextcloud version'))
  36     author_name = CharField(max_length=80, label=_('Author\'s full name'))
  37     author_email = EmailField(label=_('Author\'s e-mail'))
  38     author_homepage = URLField(label=_('Author\'s homepage'), required=False)
  39     categories = MultipleChoiceField(required=True, label=_('Categories'),
  40                                      choices=lazy(get_categories, list),
  41                                      help_text=_('Hold down CTRL and click to '
  42                                                  'select multiple entries'))
  43     summary = CharField(max_length=256, label=_('Summary'), help_text=_(
  44         'Short description of your app that will be rendered as short teaser'))
  45     description = CharField(widget=Textarea, label=_('Description'),
  46                             help_text=_('Full description of what your app '
  47                                         'does. Can contain Markdown.'))
  48
  ```
  
  Path: `nextcloudappstore/core/scaffolding/archive.py`
  Content:
  ```
  1 import re
  2 import tarfile
  3 from io import BytesIO, StringIO
  4 from typing import Dict
  5 from os.path import join, isdir, relpath
  6 from os import walk
  7 
  8 from django.template import Context
  9 from django.template import Template
  10 
  11 from nextcloudappstore.core.facades import resolve_file_relative_path
  12 from nextcloudappstore.settings.base import APP_SCAFFOLDING_PROFILES
  13 
  14 
  15 def build_files(args: Dict[str, str]) -> Dict[str, str]:
  16     platform = int(args['platform'])  # prevent path traversal
  17     vars = {
  18         'id': args['name'].lower(),
  19         'summary': args['summary'],
  20         'description': args['description'],
  21         'name': ' '.join(re.findall(r'[A-Z][^A-Z]*', args['name'])),
  22         'namespace': args['name'],
  23         'author_name': args['author_name'],
  24         'author_mail': args['author_email'],
  25         'author_homepage': args['author_homepage'],
  26         'categories': args['categories'],
  27         'nextcloud_version': platform
  28     }
  29     vars.update(APP_SCAFFOLDING_PROFILES.get(platform, {}))
  30     relative_base = 'app-templates/%i/app/' % platform
  31     base = resolve_file_relative_path(__file__, relative_base)
  32 
  33     context = Context({'app': vars})
  34     result = {}
  35     if isdir(base):
  36         for root, dirs, files in walk(base):
  37             for file in files:
  38                 file_path = join(root, file)
  39                 rel_file_path = '%s/%s' % (
  40                     vars['id'], relpath(file_path, base)
  41                 )
  42                 with open(file_path) as f:
  43                     t = Template(f.read())
  44                     result[rel_file_path] = t.render(context)
  45 
  46     return result
  47 
  48 
  49 def build_archive(parameters: Dict[str, str]) -> BytesIO:
  50     buffer = BytesIO()
  51     with tarfile.open(fileobj=buffer, mode='w:gz') as f:
  52         files = build_files(parameters)
  53         for path, contents in files.items():
  54             info = tarfile.TarInfo(path)
  55             info.size = len(contents)
  56             f.addfile(info, BytesIO(contents.encode()))
  57     buffer.seek(0)
  58     return buffer
  59
  ```
  --- END FILES ---
  
  Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.
  
  Here is an example:
  
  ```diff
  diff --git a/examples/server_async.py b/examples/server_async.py
  --- a/examples/server_async.py
  +++ b/examples/server_async.py
  @@ -313,4 +313,4 @@
   
   
   if __name__ == "__main__":
  -    asyncio.run(run_async_server("."), debug=True)
  +    asyncio.run(run_async_server(), debug=True)
  diff --git a/examples/server_sync.py b/examples/server_sync.py
  --- a/examples/server_sync.py
  +++ b/examples/server_sync.py
  @@ -313,5 +313,5 @@
   
   
   if __name__ == "__main__":
  -    server = run_sync_server(".")
  +    server = run_sync_server()
       server.shutdown()
  
  ```
  
golden_diff: diff --git a/nextcloudappstore/core/scaffolding/archive.py b/nextcloudappstore/core/scaffolding/archive.py
  --- a/nextcloudappstore/core/scaffolding/archive.py
  +++ b/nextcloudappstore/core/scaffolding/archive.py
  @@ -23,6 +23,7 @@
           'author_name': args['author_name'],
           'author_mail': args['author_email'],
           'author_homepage': args['author_homepage'],
  +        'issue_tracker': args['issue_tracker'],
           'categories': args['categories'],
           'nextcloud_version': platform
       }
  diff --git a/nextcloudappstore/core/scaffolding/forms.py b/nextcloudappstore/core/scaffolding/forms.py
  --- a/nextcloudappstore/core/scaffolding/forms.py
  +++ b/nextcloudappstore/core/scaffolding/forms.py
  @@ -36,6 +36,8 @@
       author_name = CharField(max_length=80, label=_('Author\'s full name'))
       author_email = EmailField(label=_('Author\'s e-mail'))
       author_homepage = URLField(label=_('Author\'s homepage'), required=False)
  +    issue_tracker = URLField(label=_('Issue tracker URL'), required=True,
  +                             help_text=_('Bug reports and feature requests'))
       categories = MultipleChoiceField(required=True, label=_('Categories'),
                                        choices=lazy(get_categories, list),
                                        help_text=_('Hold down CTRL and click to '
  
verification_info: {"golden_diff": "diff --git a/nextcloudappstore/core/scaffolding/archive.py b/nextcloudappstore/core/scaffolding/archive.py\n--- a/nextcloudappstore/core/scaffolding/archive.py\n+++ b/nextcloudappstore/core/scaffolding/archive.py\n@@ -23,6 +23,7 @@\n         'author_name': args['author_name'],\n         'author_mail': args['author_email'],\n         'author_homepage': args['author_homepage'],\n+        'issue_tracker': args['issue_tracker'],\n         'categories': args['categories'],\n         'nextcloud_version': platform\n     }\ndiff --git a/nextcloudappstore/core/scaffolding/forms.py b/nextcloudappstore/core/scaffolding/forms.py\n--- a/nextcloudappstore/core/scaffolding/forms.py\n+++ b/nextcloudappstore/core/scaffolding/forms.py\n@@ -36,6 +36,8 @@\n     author_name = CharField(max_length=80, label=_('Author\\'s full name'))\n     author_email = EmailField(label=_('Author\\'s e-mail'))\n     author_homepage = URLField(label=_('Author\\'s homepage'), required=False)\n+    issue_tracker = URLField(label=_('Issue tracker URL'), required=True,\n+                             help_text=_('Bug reports and feature requests'))\n     categories = MultipleChoiceField(required=True, label=_('Categories'),\n                                      choices=lazy(get_categories, list),\n                                      help_text=_('Hold down CTRL and click to '\n", "issue": "At least a single resource for support or contact should be required\nThis is simply asking us for trouble. No repo. No website. Nothing. The app was provided only over an archive on Google Drive (https://github.com/nextcloud/app-certificate-requests/pull/52) ... this is not offending developers, google drive or anything \ud83d\ude05 But - you know what I mean I hope \ud83d\ude22 \r\n\r\n<img width=\"919\" alt=\"bildschirmfoto 2017-03-01 um 11 44 38\" src=\"https://cloud.githubusercontent.com/assets/19711361/23456641/8c1a9b1c-fe74-11e6-9894-e0fec0f622e7.png\">\nAt least a single resource for support or contact should be required\nThis is simply asking us for trouble. No repo. No website. Nothing. The app was provided only over an archive on Google Drive (https://github.com/nextcloud/app-certificate-requests/pull/52) ... this is not offending developers, google drive or anything \ud83d\ude05 But - you know what I mean I hope \ud83d\ude22 \r\n\r\n<img width=\"919\" alt=\"bildschirmfoto 2017-03-01 um 11 44 38\" src=\"https://cloud.githubusercontent.com/assets/19711361/23456641/8c1a9b1c-fe74-11e6-9894-e0fec0f622e7.png\">\n", "before_files": [{"content": "import re\nfrom os import listdir\n\nfrom django.core.exceptions import ValidationError\nfrom django.forms import Textarea, Form, URLField, MultipleChoiceField\nfrom django.utils.translation import ugettext_lazy as _  # type: ignore\nfrom django.forms.fields import EmailField, CharField, ChoiceField\nfrom django.conf import settings\n\nfrom nextcloudappstore.core.facades import resolve_file_relative_path\nfrom nextcloudappstore.core.models import Category\nfrom django.utils.functional import lazy\n\n\ndef get_categories():\n    return [(cat.id, cat.name) for cat in Category.objects.all()]\n\n\ndef get_versions():\n    tpls = listdir(resolve_file_relative_path(__file__, 'app-templates'))\n    return [(v, v) for v in tpls]\n\n\ndef validate_id(input: str) -> str:\n    regex = r'^([A-Z][a-z]*)+$'\n    if not re.match(regex, input):\n        raise ValidationError(_('The app name must be camel case e.g. MyApp'))\n\n\nclass AppScaffoldingForm(Form):\n    name = CharField(max_length=80, label=_('App name'),\n                     validators=[validate_id],\n                     help_text=_('The app name must be camel case e.g. MyApp'))\n    platform = ChoiceField(choices=lazy(get_versions, list), required=True,\n                           label=_('Nextcloud version'))\n    author_name = CharField(max_length=80, label=_('Author\\'s full name'))\n    author_email = EmailField(label=_('Author\\'s e-mail'))\n    author_homepage = URLField(label=_('Author\\'s homepage'), required=False)\n    categories = MultipleChoiceField(required=True, label=_('Categories'),\n                                     choices=lazy(get_categories, list),\n                                     help_text=_('Hold down CTRL and click to '\n                                                 'select multiple entries'))\n    summary = CharField(max_length=256, label=_('Summary'), help_text=_(\n        'Short description of your app that will be rendered as short teaser'))\n    description = CharField(widget=Textarea, label=_('Description'),\n                            help_text=_('Full description of what your app '\n                                        'does. Can contain Markdown.'))\n", "path": "nextcloudappstore/core/scaffolding/forms.py"}, {"content": "import re\nimport tarfile\nfrom io import BytesIO, StringIO\nfrom typing import Dict\nfrom os.path import join, isdir, relpath\nfrom os import walk\n\nfrom django.template import Context\nfrom django.template import Template\n\nfrom nextcloudappstore.core.facades import resolve_file_relative_path\nfrom nextcloudappstore.settings.base import APP_SCAFFOLDING_PROFILES\n\n\ndef build_files(args: Dict[str, str]) -> Dict[str, str]:\n    platform = int(args['platform'])  # prevent path traversal\n    vars = {\n        'id': args['name'].lower(),\n        'summary': args['summary'],\n        'description': args['description'],\n        'name': ' '.join(re.findall(r'[A-Z][^A-Z]*', args['name'])),\n        'namespace': args['name'],\n        'author_name': args['author_name'],\n        'author_mail': args['author_email'],\n        'author_homepage': args['author_homepage'],\n        'categories': args['categories'],\n        'nextcloud_version': platform\n    }\n    vars.update(APP_SCAFFOLDING_PROFILES.get(platform, {}))\n    relative_base = 'app-templates/%i/app/' % platform\n    base = resolve_file_relative_path(__file__, relative_base)\n\n    context = Context({'app': vars})\n    result = {}\n    if isdir(base):\n        for root, dirs, files in walk(base):\n            for file in files:\n                file_path = join(root, file)\n                rel_file_path = '%s/%s' % (\n                    vars['id'], relpath(file_path, base)\n                )\n                with open(file_path) as f:\n                    t = Template(f.read())\n                    result[rel_file_path] = t.render(context)\n\n    return result\n\n\ndef build_archive(parameters: Dict[str, str]) -> BytesIO:\n    buffer = BytesIO()\n    with tarfile.open(fileobj=buffer, mode='w:gz') as f:\n        files = build_files(parameters)\n        for path, contents in files.items():\n            info = tarfile.TarInfo(path)\n            info.size = len(contents)\n            f.addfile(info, BytesIO(contents.encode()))\n    buffer.seek(0)\n    return buffer\n", "path": "nextcloudappstore/core/scaffolding/archive.py"}], "after_files": [{"content": "import re\nfrom os import listdir\n\nfrom django.core.exceptions import ValidationError\nfrom django.forms import Textarea, Form, URLField, MultipleChoiceField\nfrom django.utils.translation import ugettext_lazy as _  # type: ignore\nfrom django.forms.fields import EmailField, CharField, ChoiceField\nfrom django.conf import settings\n\nfrom nextcloudappstore.core.facades import resolve_file_relative_path\nfrom nextcloudappstore.core.models import Category\nfrom django.utils.functional import lazy\n\n\ndef get_categories():\n    return [(cat.id, cat.name) for cat in Category.objects.all()]\n\n\ndef get_versions():\n    tpls = listdir(resolve_file_relative_path(__file__, 'app-templates'))\n    return [(v, v) for v in tpls]\n\n\ndef validate_id(input: str) -> str:\n    regex = r'^([A-Z][a-z]*)+$'\n    if not re.match(regex, input):\n        raise ValidationError(_('The app name must be camel case e.g. MyApp'))\n\n\nclass AppScaffoldingForm(Form):\n    name = CharField(max_length=80, label=_('App name'),\n                     validators=[validate_id],\n                     help_text=_('The app name must be camel case e.g. MyApp'))\n    platform = ChoiceField(choices=lazy(get_versions, list), required=True,\n                           label=_('Nextcloud version'))\n    author_name = CharField(max_length=80, label=_('Author\\'s full name'))\n    author_email = EmailField(label=_('Author\\'s e-mail'))\n    author_homepage = URLField(label=_('Author\\'s homepage'), required=False)\n    issue_tracker = URLField(label=_('Issue tracker URL'), required=True,\n                             help_text=_('Bug reports and feature requests'))\n    categories = MultipleChoiceField(required=True, label=_('Categories'),\n                                     choices=lazy(get_categories, list),\n                                     help_text=_('Hold down CTRL and click to '\n                                                 'select multiple entries'))\n    summary = CharField(max_length=256, label=_('Summary'), help_text=_(\n        'Short description of your app that will be rendered as short teaser'))\n    description = CharField(widget=Textarea, label=_('Description'),\n                            help_text=_('Full description of what your app '\n                                        'does. Can contain Markdown.'))\n", "path": "nextcloudappstore/core/scaffolding/forms.py"}, {"content": "import re\nimport tarfile\nfrom io import BytesIO, StringIO\nfrom typing import Dict\nfrom os.path import join, isdir, relpath\nfrom os import walk\n\nfrom django.template import Context\nfrom django.template import Template\n\nfrom nextcloudappstore.core.facades import resolve_file_relative_path\nfrom nextcloudappstore.settings.base import APP_SCAFFOLDING_PROFILES\n\n\ndef build_files(args: Dict[str, str]) -> Dict[str, str]:\n    platform = int(args['platform'])  # prevent path traversal\n    vars = {\n        'id': args['name'].lower(),\n        'summary': args['summary'],\n        'description': args['description'],\n        'name': ' '.join(re.findall(r'[A-Z][^A-Z]*', args['name'])),\n        'namespace': args['name'],\n        'author_name': args['author_name'],\n        'author_mail': args['author_email'],\n        'author_homepage': args['author_homepage'],\n        'issue_tracker': args['issue_tracker'],\n        'categories': args['categories'],\n        'nextcloud_version': platform\n    }\n    vars.update(APP_SCAFFOLDING_PROFILES.get(platform, {}))\n    relative_base = 'app-templates/%i/app/' % platform\n    base = resolve_file_relative_path(__file__, relative_base)\n\n    context = Context({'app': vars})\n    result = {}\n    if isdir(base):\n        for root, dirs, files in walk(base):\n            for file in files:\n                file_path = join(root, file)\n                rel_file_path = '%s/%s' % (\n                    vars['id'], relpath(file_path, base)\n                )\n                with open(file_path) as f:\n                    t = Template(f.read())\n                    result[rel_file_path] = t.render(context)\n\n    return result\n\n\ndef build_archive(parameters: Dict[str, str]) -> BytesIO:\n    buffer = BytesIO()\n    with tarfile.open(fileobj=buffer, mode='w:gz') as f:\n        files = build_files(parameters)\n        for path, contents in files.items():\n            info = tarfile.TarInfo(path)\n            info.size = len(contents)\n            f.addfile(info, BytesIO(contents.encode()))\n    buffer.seek(0)\n    return buffer\n", "path": "nextcloudappstore/core/scaffolding/archive.py"}]}