1
0
mirror of https://github.com/openSUSE/osc.git synced 2025-03-01 13:42:12 +01:00

Remove all path quoting, rely on makeurl()

This commit is contained in:
Daniel Mach 2024-02-01 21:14:32 +01:00
parent dcd147f52d
commit 0f8a8430fc
5 changed files with 49 additions and 51 deletions

View File

@ -21,7 +21,7 @@ from . import conf
from . import connection
from . import core
from . import oscerr
from .core import get_buildinfo, meta_exists, quote_plus, get_buildconfig, dgst
from .core import get_buildinfo, meta_exists, get_buildconfig, dgst
from .core import get_binarylist, get_binary_file, run_external, return_external, raw_input
from .fetch import Fetcher, OscFileGrabber, verify_pacs
from .meter import create_text_meter
@ -1021,13 +1021,13 @@ def main(apiurl, store, opts, argv):
except HTTPError as e:
if e.code == 404:
# check what caused the 404
if meta_exists(metatype='prj', path_args=(quote_plus(prj), ),
if meta_exists(metatype='prj', path_args=(prj, ),
template_args=None, create_new=False, apiurl=apiurl):
pkg_meta_e = None
try:
# take care, not to run into double trouble.
pkg_meta_e = meta_exists(metatype='pkg', path_args=(quote_plus(prj),
quote_plus(pac)), template_args=None, create_new=False,
pkg_meta_e = meta_exists(metatype='pkg', path_args=(prj, pac),
template_args=None, create_new=False,
apiurl=apiurl)
except:
pass

View File

@ -1949,7 +1949,7 @@ class Osc(cmdln.Cmdln):
edit=True,
force=opts.force,
remove_linking_repositories=opts.remove_linking_repositories,
path_args=quote_plus(project),
path_args=(project, ),
apiurl=apiurl,
msg=opts.message,
template_args=({
@ -1958,7 +1958,7 @@ class Osc(cmdln.Cmdln):
elif cmd == 'pkg':
edit_meta(metatype='pkg',
edit=True,
path_args=(quote_plus(project), quote_plus(package)),
path_args=(project, package),
apiurl=apiurl,
template_args=({
'name': package,
@ -1966,20 +1966,20 @@ class Osc(cmdln.Cmdln):
elif cmd == 'prjconf':
edit_meta(metatype='prjconf',
edit=True,
path_args=quote_plus(project),
path_args=(project, ),
apiurl=apiurl,
msg=opts.message,
template_args=None)
elif cmd == 'user':
edit_meta(metatype='user',
edit=True,
path_args=(quote_plus(user)),
path_args=(user, ),
apiurl=apiurl,
template_args=({'user': user}))
elif cmd == 'group':
edit_meta(metatype='group',
edit=True,
path_args=(quote_plus(group)),
path_args=(group, ),
apiurl=apiurl,
template_args=({'group': group}))
elif cmd == 'pattern':
@ -1992,7 +1992,7 @@ class Osc(cmdln.Cmdln):
edit_meta(
metatype='attribute',
edit=True,
path_args=(quote_plus(project), quote_plus(opts.attribute)),
path_args=(project, opts.attribute),
apiurl=apiurl,
# PUT is not supported
method="POST",
@ -2061,32 +2061,32 @@ class Osc(cmdln.Cmdln):
remove_linking_repositories=opts.remove_linking_repositories,
apiurl=apiurl,
msg=opts.message,
path_args=quote_plus(project))
path_args=(project, ))
elif cmd == 'pkg':
edit_meta(metatype='pkg',
data=f,
edit=opts.edit,
apiurl=apiurl,
path_args=(quote_plus(project), quote_plus(package)))
path_args=(project, package))
elif cmd == 'prjconf':
edit_meta(metatype='prjconf',
data=f,
edit=opts.edit,
apiurl=apiurl,
msg=opts.message,
path_args=quote_plus(project))
path_args=(project, ))
elif cmd == 'user':
edit_meta(metatype='user',
data=f,
edit=opts.edit,
apiurl=apiurl,
path_args=(quote_plus(user)))
path_args=(user, ))
elif cmd == 'group':
edit_meta(metatype='group',
data=f,
edit=opts.edit,
apiurl=apiurl,
path_args=(quote_plus(group)))
path_args=(group, ))
elif cmd == 'pattern':
edit_meta(metatype='pattern',
data=f,
@ -6276,7 +6276,7 @@ Please submit there instead, or use --nodevelproject to force direct submission.
query['last'] = 1
if opts.lastsucceeded:
query['lastsucceeded'] = 1
u = makeurl(self.get_api_url(), ['build', quote_plus(project), quote_plus(repository), quote_plus(arch), quote_plus(package), '_log'], query=query)
u = makeurl(self.get_api_url(), ['build', project, repository, arch, package, '_log'], query=query)
f = http_GET(u)
root = ET.parse(f).getroot()
offset = int(root.find('entry').get('size'))
@ -6289,7 +6289,7 @@ Please submit there instead, or use --nodevelproject to force direct submission.
elif opts.offset:
offset = int(opts.offset)
strip_time = opts.strip_time or conf.config['buildlog_strip_time']
print_buildlog(apiurl, quote_plus(project), quote_plus(package), quote_plus(repository), quote_plus(arch), offset, strip_time, opts.last, opts.lastsucceeded)
print_buildlog(apiurl, project, package, repository, arch, offset, strip_time, opts.last, opts.lastsucceeded)
def print_repos(self, repos_only=False, exc_class=oscerr.WrongArgs, exc_msg='Missing arguments', project=None):
wd = Path.cwd()
@ -6370,7 +6370,7 @@ Please submit there instead, or use --nodevelproject to force direct submission.
query['last'] = 1
if opts.lastsucceeded:
query['lastsucceeded'] = 1
u = makeurl(self.get_api_url(), ['build', quote_plus(project), quote_plus(repository), quote_plus(arch), quote_plus(package), '_log'], query=query)
u = makeurl(self.get_api_url(), ['build', project, repository, arch, package, '_log'], query=query)
f = http_GET(u)
root = ET.parse(f).getroot()
offset = int(root.find('entry').get('size'))
@ -6383,7 +6383,7 @@ Please submit there instead, or use --nodevelproject to force direct submission.
elif opts.offset:
offset = int(opts.offset)
strip_time = opts.strip_time or conf.config['buildlog_strip_time']
print_buildlog(apiurl, quote_plus(project), quote_plus(package), quote_plus(repository), quote_plus(arch), offset, strip_time, opts.last, opts.lastsucceeded)
print_buildlog(apiurl, project, package, repository, arch, offset, strip_time, opts.last, opts.lastsucceeded)
def _find_last_repo_arch(self, repo=None, fatal=True):
files = glob.glob(os.path.join(Path.cwd(), store, "_buildinfo-*"))
@ -8709,7 +8709,7 @@ Please submit there instead, or use --nodevelproject to force direct submission.
apiurl = osc_store.Store(project_dir).apiurl
user = conf.get_apiurl_usr(apiurl)
data = meta_exists(metatype='pkg',
path_args=(quote_plus(project), quote_plus(pac)),
path_args=(project, pac),
template_args=({
'name': pac,
'user': user}), apiurl=apiurl)
@ -8723,7 +8723,7 @@ Please submit there instead, or use --nodevelproject to force direct submission.
print('error - cannot get meta data', file=sys.stderr)
sys.exit(1)
edit_meta(metatype='pkg',
path_args=(quote_plus(project), quote_plus(pac)),
path_args=(project, pac),
data=data, apiurl=apiurl)
Package.init_package(apiurl, project, pac, os.path.join(project_dir, pac))
else:
@ -9254,7 +9254,7 @@ Please submit there instead, or use --nodevelproject to force direct submission.
o = open(destfile, 'wb')
if md5 != '':
query = {'rev': dir['srcmd5']}
u = makeurl(dir['apiurl'], ['source', dir['project'], dir['package'], pathname2url(name)], query=query)
u = makeurl(dir['apiurl'], ['source', dir['project'], dir['package'], name], query=query)
for buf in streamfile(u, http_GET, BUFSIZE):
o.write(buf)
o.close()

View File

@ -36,9 +36,8 @@ from http.client import IncompleteRead
from io import StringIO
from pathlib import Path
from typing import Optional, Dict, Union, List, Iterable
from urllib.parse import urlsplit, urlunsplit, urlparse, quote, quote_plus, urlencode, unquote
from urllib.parse import urlsplit, urlunsplit, urlparse, quote, urlencode, unquote
from urllib.error import HTTPError
from urllib.request import pathname2url
from xml.etree import ElementTree as ET
try:
@ -1116,7 +1115,7 @@ class Project:
else:
user = conf.get_apiurl_usr(self.apiurl)
edit_meta(metatype='pkg',
path_args=(quote_plus(self.name), quote_plus(pac)),
path_args=(self.name, pac),
template_args=({
'name': pac,
'user': user}),
@ -1171,11 +1170,11 @@ class Project:
package = store_read_package(pac_path)
apiurl = store.apiurl
if not meta_exists(metatype='pkg',
path_args=(quote_plus(project), quote_plus(package)),
path_args=(project, package),
template_args=None, create_new=False, apiurl=apiurl):
user = conf.get_apiurl_usr(self.apiurl)
edit_meta(metatype='pkg',
path_args=(quote_plus(project), quote_plus(package)),
path_args=(project, package),
template_args=({'name': pac, 'user': user}), apiurl=apiurl)
p = Package(pac_path)
p.todo = files
@ -1542,7 +1541,7 @@ class Package:
def delete_remote_source_file(self, n):
"""delete a remote source file (e.g. from the server)"""
query = 'rev=upload'
u = makeurl(self.apiurl, ['source', self.prjname, self.name, pathname2url(n)], query=query)
u = makeurl(self.apiurl, ['source', self.prjname, self.name, n], query=query)
http_DELETE(u)
def put_source_file(self, n, tdir, copy_only=False):
@ -1552,7 +1551,7 @@ class Package:
# escaping '+' in the URL path (note: not in the URL query string) is
# only a workaround for ruby on rails, which swallows it otherwise
if not copy_only:
u = makeurl(self.apiurl, ['source', self.prjname, self.name, pathname2url(n)], query=query)
u = makeurl(self.apiurl, ['source', self.prjname, self.name, n], query=query)
http_PUT(u, file=tfilename)
if n in self.to_be_added:
self.to_be_added.remove(n)
@ -5179,7 +5178,7 @@ def get_group(apiurl: str, group: str):
def get_group_meta(apiurl: str, group: str):
u = makeurl(apiurl, ['group', quote_plus(group)])
u = makeurl(apiurl, ['group', group])
try:
f = http_GET(u)
return b''.join(f.readlines())
@ -5189,7 +5188,7 @@ def get_group_meta(apiurl: str, group: str):
def get_user_meta(apiurl: str, user: str):
u = makeurl(apiurl, ['person', quote_plus(user)])
u = makeurl(apiurl, ['person', user])
try:
f = http_GET(u)
return b''.join(f.readlines())
@ -5270,7 +5269,7 @@ def get_source_file(
query['rev'] = revision
u = makeurl(
apiurl,
["source", prj, package, pathname2url(filename.encode(locale.getpreferredencoding(), "replace"))],
["source", prj, package, filename],
query=query,
)
download(u, targetfilename, progress_obj, mtime)
@ -5701,7 +5700,7 @@ def checkout_package(
# before we create directories and stuff, check if the package actually
# exists
meta_data = b''.join(show_package_meta(apiurl, quote_plus(project), quote_plus(package)))
meta_data = b''.join(show_package_meta(apiurl, project, package))
root = ET.fromstring(meta_data)
scmsync_element = root.find("scmsync")
if scmsync_element is not None and scmsync_element.text is not None:
@ -5821,7 +5820,7 @@ def link_pac(
apiurl = conf.config['apiurl']
try:
dst_meta = meta_exists(metatype='pkg',
path_args=(quote_plus(dst_project), quote_plus(dst_package)),
path_args=(dst_project, dst_package),
template_args=None,
create_new=False, apiurl=apiurl)
root = ET.fromstring(parse_meta_to_string(dst_meta))
@ -5951,7 +5950,7 @@ def aggregate_pac(
try:
dst_meta = meta_exists(metatype='pkg',
path_args=(quote_plus(dst_project), quote_plus(dst_package_meta)),
path_args=(dst_project, dst_package_meta),
template_args=None,
create_new=False, apiurl=apiurl)
root = ET.fromstring(parse_meta_to_string(dst_meta))
@ -6245,7 +6244,7 @@ def copy_pac(
src_meta = replace_pkg_meta(src_meta, dst_package, dst_project, keep_maintainers,
dst_userid, keep_develproject)
url = make_meta_url('pkg', (quote_plus(dst_project),) + (quote_plus(dst_package),), dst_apiurl)
url = make_meta_url('pkg', (dst_project, dst_package), dst_apiurl)
found = None
try:
found = http_GET(url).readlines()
@ -6294,7 +6293,7 @@ def copy_pac(
with tempfile.NamedTemporaryFile(prefix='osc-copypac') as f:
get_source_file(src_apiurl, src_project, src_package, filename,
targetfilename=f.name, revision=revision)
path = ['source', dst_project, dst_package, pathname2url(filename)]
path = ['source', dst_project, dst_package, filename]
u = makeurl(dst_apiurl, path, query={'rev': 'repository'})
http_PUT(u, file=f.name)
tfilelist = Package.commit_filelist(dst_apiurl, dst_project, dst_package,
@ -7874,10 +7873,10 @@ def addMaintainer(apiurl: str, prj: str, pac: str, user: str):
def addPerson(apiurl: str, prj: str, pac: str, user: str, role="maintainer"):
""" add a new person to a package or project """
path = quote_plus(prj),
path = (prj, )
kind = 'prj'
if pac:
path = path + (quote_plus(pac),)
path = path + (pac ,)
kind = 'pkg'
data = meta_exists(metatype=kind,
path_args=path,
@ -7910,10 +7909,10 @@ def delMaintainer(apiurl: str, prj: str, pac: str, user: str):
def delPerson(apiurl: str, prj: str, pac: str, user: str, role="maintainer"):
""" delete a person from a package or project """
path = quote_plus(prj),
path = (prj, )
kind = 'prj'
if pac:
path = path + (quote_plus(pac), )
path = path + (pac, )
kind = 'pkg'
data = meta_exists(metatype=kind,
path_args=path,
@ -7939,10 +7938,10 @@ def delPerson(apiurl: str, prj: str, pac: str, user: str, role="maintainer"):
def setBugowner(apiurl: str, prj: str, pac: str, user=None, group=None):
""" delete all bugowners (user and group entries) and set one new one in a package or project """
path = quote_plus(prj),
path = (prj, )
kind = 'prj'
if pac:
path = path + (quote_plus(pac), )
path = path + (pac, )
kind = 'pkg'
data = meta_exists(metatype=kind,
path_args=path,
@ -7972,7 +7971,7 @@ def setBugowner(apiurl: str, prj: str, pac: str, user=None, group=None):
def setDevelProject(apiurl, prj, pac, dprj, dpkg=None):
""" set the <devel project="..."> element to package metadata"""
path = (quote_plus(prj),) + (quote_plus(pac),)
path = (prj, pac)
data = meta_exists(metatype='pkg',
path_args=path,
template_args=None,

View File

@ -10,7 +10,6 @@ import shutil
import subprocess
import sys
import tempfile
from urllib.parse import quote_plus
from urllib.request import HTTPError
from . import checker as osc_checker
@ -51,10 +50,10 @@ class Fetcher:
def __download_cpio_archive(self, apiurl, project, repo, arch, package, **pkgs):
if not pkgs:
return
query = [f'binary={quote_plus(i)}' for i in pkgs]
query.append('view=cpio')
for module in self.modules:
query.append(f"module={module}")
query = {}
query["binary"] = pkgs
query["view"] = "cpio"
query["module"] = self.modules
try:
url = makeurl(apiurl, ['build', project, repo, arch, package], query=query)
sys.stdout.write("preparing download ...\r")

View File

@ -193,8 +193,8 @@ class TestUpdate(OscTestCase):
@GET('http://localhost/source/osctest/services?rev=latest', file='testUpdateServiceFilesAddDelete_filesremote')
@GET('http://localhost/source/osctest/services/bigfile?rev=2', file='testUpdateServiceFilesAddDelete_bigfile')
@GET('http://localhost/source/osctest/services/_service%3Abar?rev=2', file='testUpdateServiceFilesAddDelete__service:bar')
@GET('http://localhost/source/osctest/services/_service%3Afoo?rev=2', file='testUpdateServiceFilesAddDelete__service:foo')
@GET('http://localhost/source/osctest/services/_service:bar?rev=2', file='testUpdateServiceFilesAddDelete__service:bar')
@GET('http://localhost/source/osctest/services/_service:foo?rev=2', file='testUpdateServiceFilesAddDelete__service:foo')
@GET('http://localhost/source/osctest/services/_meta', file='meta.xml')
def testUpdateAddDeleteServiceFiles(self):
"""update package with _service:* files"""