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

View File

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

View File

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

View File

@ -10,7 +10,6 @@ import shutil
import subprocess import subprocess
import sys import sys
import tempfile import tempfile
from urllib.parse import quote_plus
from urllib.request import HTTPError from urllib.request import HTTPError
from . import checker as osc_checker from . import checker as osc_checker
@ -51,10 +50,10 @@ class Fetcher:
def __download_cpio_archive(self, apiurl, project, repo, arch, package, **pkgs): def __download_cpio_archive(self, apiurl, project, repo, arch, package, **pkgs):
if not pkgs: if not pkgs:
return return
query = [f'binary={quote_plus(i)}' for i in pkgs] query = {}
query.append('view=cpio') query["binary"] = pkgs
for module in self.modules: query["view"] = "cpio"
query.append(f"module={module}") query["module"] = self.modules
try: try:
url = makeurl(apiurl, ['build', project, repo, arch, package], query=query) url = makeurl(apiurl, ['build', project, repo, arch, package], query=query)
sys.stdout.write("preparing download ...\r") 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?rev=latest', file='testUpdateServiceFilesAddDelete_filesremote')
@GET('http://localhost/source/osctest/services/bigfile?rev=2', file='testUpdateServiceFilesAddDelete_bigfile') @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:bar?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:foo?rev=2', file='testUpdateServiceFilesAddDelete__service:foo')
@GET('http://localhost/source/osctest/services/_meta', file='meta.xml') @GET('http://localhost/source/osctest/services/_meta', file='meta.xml')
def testUpdateAddDeleteServiceFiles(self): def testUpdateAddDeleteServiceFiles(self):
"""update package with _service:* files""" """update package with _service:* files"""