1
0
mirror of https://github.com/openSUSE/osc.git synced 2024-11-09 22:36:14 +01:00

Merge pull request #1144 from dmach/1141-search-requests-created-by-myself

Properly handle osc rq -M/--mine option
This commit is contained in:
Daniel Mach 2022-09-20 13:09:25 +02:00 committed by GitHub
commit 1fe2b17957
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 206 additions and 142 deletions

View File

@ -1679,7 +1679,7 @@ Please submit there instead, or use --nodevelproject to force direct submission.
% (devloc, dst_package)) % (devloc, dst_package))
sys.exit(1) sys.exit(1)
reqs = get_request_list(apiurl, dst_project, dst_package, req_type='submit', req_state=['new', 'review']) reqs = get_request_collection(apiurl, project=dst_project, package=dst_package, types=['submit'], states=['new', 'review'])
user = conf.get_apiurl_usr(apiurl) user = conf.get_apiurl_usr(apiurl)
myreqs = [i for i in reqs if i.state.who == user and i.reqid != opts.supersede] myreqs = [i for i in reqs if i.state.who == user and i.reqid != opts.supersede]
myreq_ids = [r.reqid for r in myreqs] myreq_ids = [r.reqid for r in myreqs]
@ -2163,8 +2163,8 @@ Please submit there instead, or use --nodevelproject to force direct submission.
help='all states. Same as\'-s all\'') help='all states. Same as\'-s all\'')
@cmdln.option('-f', '--force', action='store_true', @cmdln.option('-f', '--force', action='store_true',
help='enforce state change, can be used to ignore open reviews') help='enforce state change, can be used to ignore open reviews')
@cmdln.option('-s', '--state', default='', # default is 'all' if no args given, 'new,review' otherwise @cmdln.option('-s', '--state', default='new,review',
help='only list requests in one of the comma separated given states (new/review/accepted/revoked/declined) or "all" [default="new,review", or "all", if no args given]') help='only list requests in one of the comma separated given states (new/review/accepted/revoked/declined) or "all" [default="new,review"]')
@cmdln.option('-D', '--days', metavar='DAYS', @cmdln.option('-D', '--days', metavar='DAYS',
help='only list requests in state "new" or changed in the last DAYS.') help='only list requests in state "new" or changed in the last DAYS.')
@cmdln.option('-U', '--user', metavar='USER', @cmdln.option('-U', '--user', metavar='USER',
@ -2297,11 +2297,6 @@ Please submit there instead, or use --nodevelproject to force direct submission.
if not args: if not args:
args = ['list'] args = ['list']
opts.mine = 1 opts.mine = 1
if opts.state == '':
opts.state = 'all'
if opts.state == '' and subcmd != 'review':
opts.state = 'new,review'
if opts.incoming: if opts.incoming:
conf.config['include_request_from_project'] = False conf.config['include_request_from_project'] = False
@ -2420,7 +2415,7 @@ Please submit there instead, or use --nodevelproject to force direct submission.
who = '' who = ''
if cmd == 'approvenew': if cmd == 'approvenew':
states = ('new') states = ('new')
results = get_request_list(apiurl, project, package, '', ['new']) results = get_request_collection(apiurl, project=project, package=package, states=['new'])
else: else:
state_list = opts.state.split(',') state_list = opts.state.split(',')
if state_list == ['']: if state_list == ['']:
@ -2450,8 +2445,10 @@ Please submit there instead, or use --nodevelproject to force direct submission.
results = get_user_projpkgs_request_list(apiurl, who, req_state=state_list, results = get_user_projpkgs_request_list(apiurl, who, req_state=state_list,
req_type=opts.type, exclude_projects=opts.exclude_target_project or []) req_type=opts.type, exclude_projects=opts.exclude_target_project or [])
else: else:
results = get_request_list(apiurl, project, package, who, roles = ["creator"] if opts.mine else None
state_list, opts.type, opts.exclude_target_project or []) results = get_request_collection(
apiurl, project=project, package=package, user=who,
states=state_list, types=opts.type, roles=roles)
# Check if project actually exists if result list is empty # Check if project actually exists if result list is empty
if not results: if not results:
@ -3728,7 +3725,7 @@ Please submit there instead, or use --nodevelproject to force direct submission.
raise oscerr.WrongArgs('Package argument is empty') raise oscerr.WrongArgs('Package argument is empty')
# FIXME: core.py:commitDelPackage() should have something similar # FIXME: core.py:commitDelPackage() should have something similar
rlist = get_request_list(apiurl, prj, pkg) rlist = get_request_collection(apiurl, project=prj, package=pkg)
for rq in rlist: for rq in rlist:
print(rq) print(rq)
if len(rlist) >= 1 and not opts.force: if len(rlist) >= 1 and not opts.force:
@ -4290,8 +4287,7 @@ Please submit there instead, or use --nodevelproject to force direct submission.
new_packages = meta_get_packagelist(apiurl, newprj) new_packages = meta_get_packagelist(apiurl, newprj)
if opts.requests: if opts.requests:
requests = get_request_list(apiurl, project=oldprj, requests = get_request_collection(apiurl, project=oldprj, states=('new', 'review'))
req_state=('new', 'review'))
for pkg in old_packages: for pkg in old_packages:
if self._prdiff_skip_package(opts, pkg): if self._prdiff_skip_package(opts, pkg):
@ -4314,8 +4310,7 @@ Please submit there instead, or use --nodevelproject to force direct submission.
self._prdiff_output_diff(opts, rdiff) self._prdiff_output_diff(opts, rdiff)
if opts.requests: if opts.requests:
self._prdiff_output_matching_requests(opts, requests, self._prdiff_output_matching_requests(opts, requests, newprj, pkg)
newprj, pkg)
else: else:
print("identical: %s" % pkg) print("identical: %s" % pkg)
@ -7425,7 +7420,7 @@ Please submit there instead, or use --nodevelproject to force direct submission.
elif type in args_prj: elif type in args_prj:
what = {'project': ''} what = {'project': ''}
elif type in args_sr: elif type in args_sr:
requests = get_request_collection(apiurl, 'creator', req_who=user) requests = get_request_collection(apiurl, roles=['creator'], user=user)
for r in sorted(requests, key=lambda x: x.reqid): for r in sorted(requests, key=lambda x: x.reqid):
print(r.list_view(), '\n') print(r.list_view(), '\n')
return return

View File

@ -2856,6 +2856,7 @@ class Action:
return Action(action_node.get('type'), **kwargs) return Action(action_node.get('type'), **kwargs)
@total_ordering
class Request: class Request:
"""Represents a request (``<request />``)""" """Represents a request (``<request />``)"""
@ -2875,6 +2876,12 @@ class Request:
self.statehistory = [] self.statehistory = []
self.reviews = [] self.reviews = []
def __eq__(self, other):
return int(self.reqid) == int(other.reqid)
def __lt__(self, other):
return int(self.reqid) < int(other.reqid)
def read(self, root): def read(self, root):
"""read in a request""" """read in a request"""
self._init_attributes() self._init_attributes()
@ -3068,6 +3075,7 @@ class Request:
if self.state.name == 'review' and self.state.approver: if self.state.name == 'review' and self.state.approver:
status += "(approved)" status += "(approved)"
lines = ['%6s State:%-10s By:%-12s When:%-19s' % (self.reqid, status, self.state.who, self.state.when)] lines = ['%6s State:%-10s By:%-12s When:%-19s' % (self.reqid, status, self.state.who, self.state.when)]
lines += [f" Created by: {self.creator}"]
tmpl = ' %(type)-16s %(source)-50s %(target)s' tmpl = ' %(type)-16s %(source)-50s %(target)s'
for action in self.actions: for action in self.actions:
lines.append(tmpl % self.format_action(action)) lines.append(tmpl % self.format_action(action))
@ -3086,64 +3094,61 @@ class Request:
def __str__(self): def __str__(self):
"""return "detailed" format""" """return "detailed" format"""
lines = ['Request: #%s\n' % self.reqid] lines = [
f"Request: {self.reqid}",
f"Created by: {self.creator}",
]
if self.accept_at and self.state.name in ['new', 'review']: if self.accept_at and self.state.name in ['new', 'review']:
lines.append(' *** This request will get automatically accepted after ' + self.accept_at + ' ! ***\n') lines.append(' *** This request will get automatically accepted after ' + self.accept_at + ' ! ***\n')
if self.priority in ['critical', 'important'] and self.state.name in ['new', 'review']: if self.priority in ['critical', 'important'] and self.state.name in ['new', 'review']:
lines.append(' *** This request has classified as ' + self.priority + ' ! ***\n') lines.append(' *** This request has classified as ' + self.priority + ' ! ***\n')
if self.state and self.state.approver and self.state.name == 'review': if self.state and self.state.approver and self.state.name == 'review':
lines.append(' *** This request got approved by ' + self.state.approver + '. It will get automatically accepted after last review got accepted! ***\n') lines.append(' *** This request got approved by ' + self.state.approver + '. It will get automatically accepted after last review got accepted! ***\n')
lines += ["", "Actions:"]
for action in self.actions: for action in self.actions:
tmpl = ' %(type)-13s %(source)s %(target)s' fmt_action = self.format_action(action, show_srcupdate=True)
if action.type == 'delete': if action.type == 'delete':
# remove 1 whitespace because source is empty lines += [f" {fmt_action['type']:13} {fmt_action['target']}"]
tmpl = ' %(type)-12s %(source)s %(target)s' else:
lines.append(tmpl % self.format_action(action, show_srcupdate=True)) lines += [f" {fmt_action['type']:13} {fmt_action['source']} {fmt_action['target']}"]
lines.append('\n\nMessage:')
if self.description: lines += ["", "Message:", textwrap.indent(self.description or "<no message>", prefix=" ")]
lines.append(self.description)
else:
lines.append('<no message>')
if self.state: if self.state:
lines.append('\nState: %-10s %-12s %s' % (self.state.name, self.state.when, self.state.who)) lines += ["", "State:", f" {self.state.name:61} {self.state.when:12} {self.state.who}"]
lines.append('Comment: %s' % (self.state.comment or '<no comment>')) if self.state.comment:
lines += [textwrap.indent(self.state.comment, prefix=" | ", predicate=lambda line: True)]
indent = '\n ' if self.reviews:
tmpl = '%(state)-10s %(by)-50s %(when)-12s %(who)-20s %(comment)s' lines += [""]
reviews = [] lines += ["Review:"]
for review in reversed(self.reviews): for review in reversed(self.reviews):
d = {'state': review.state} d = {'state': review.state}
if review.by_user: if review.by_user:
d['by'] = "User: " + review.by_user d['by'] = "User: " + review.by_user
if review.by_group: if review.by_group:
d['by'] = "Group: " + review.by_group d['by'] = "Group: " + review.by_group
if review.by_package: if review.by_package:
d['by'] = "Package: " + review.by_project + "/" + review.by_package d['by'] = "Package: " + review.by_project + "/" + review.by_package
elif review.by_project: elif review.by_project:
d['by'] = "Project: " + review.by_project d['by'] = "Project: " + review.by_project
d['when'] = review.when or '' d['when'] = review.when or ''
d['who'] = review.who or '' d['who'] = review.who or ''
d['comment'] = '' lines += [f" {d['state']:10} {d['by']:50} {d['when']:12} {d['who']}"]
if review.comment: if review.comment:
d['comment'] = '\n ' + review.comment lines += [textwrap.indent(review.comment, prefix=" | ", predicate=lambda line: True)]
reviews.append(tmpl % d)
if reviews:
lines.append('\nReview: %s' % indent.join(reviews))
tmpl = '%(when)-10s %(who)-12s %(desc)s' if self.statehistory:
histories = [] lines += ["", "History:"]
for hist in reversed(self.statehistory): for hist in reversed(self.statehistory):
d = {'when': hist.when, 'who': hist.who, 'desc': hist.description} lines += [f" {hist.when:10} {hist.who:30} {hist.description}"]
histories.append(tmpl % d)
if histories:
lines.append('\nHistory: %s' % indent.join(histories))
return '\n'.join(lines) return '\n'.join(lines)
def __cmp__(self, other):
return cmp(int(self.reqid), int(other.reqid))
def create(self, apiurl, addrevision=False, enforce_branching=False): def create(self, apiurl, addrevision=False, enforce_branching=False):
"""create a new request""" """create a new request"""
query = {'cmd': 'create'} query = {'cmd': 'create'}
@ -4441,18 +4446,53 @@ def get_review_list(apiurl, project='', package='', byuser='', bygroup='', bypro
requests.append(r) requests.append(r)
return requests return requests
# this function uses the logic in the api which is faster and more exact then the xpath search # this function uses the logic in the api which is faster and more exact then the xpath search
def get_request_collection(
apiurl,
user=None, group=None, roles=None,
project=None, package=None,
states=None, review_states=None,
types=None, ids=None):
# We don't want to overload server by requesting everything.
def get_request_collection(apiurl, role=None, req_who=None, req_states=('new', 'review', 'declined')): # Let's enforce specifying at least some search criteria.
if not any([user, group, project, package, ids]):
raise ValueError("Please specify search criteria")
query = {"view": "collection"} query = {"view": "collection"}
if role:
query["roles"] = role
if req_who:
query["user"] = req_who
query["states"] = ",".join(req_states) if user:
query["user"] = user
if group:
query["group"] = group
if roles:
query["roles"] = ",".join(roles)
if project:
query["project"] = project
if package:
if not project:
raise ValueError("Project must be set to query a package; see https://github.com/openSUSE/open-build-service/issues/13075")
query["package"] = package
states = states or ("new", "review")
if states:
if "all" not in states:
query["states"] = ",".join(states)
if review_states:
if "all" not in review_states:
query["review_states"] = ",".join(review_states)
if types:
query["types"] = ",".join(types)
if ids:
query["ids"] = ",".join(ids)
u = makeurl(apiurl, ['request'], query) u = makeurl(apiurl, ['request'], query)
f = http_GET(u) f = http_GET(u)
@ -4498,51 +4538,33 @@ def get_exact_request_list(apiurl, src_project, dst_project, src_package=None, d
return requests return requests
def get_request_list(apiurl, project='', package='', req_who='', req_state=('new', 'review', 'declined'), req_type=None, exclude_target_projects=None, def get_request_list(apiurl, project='', package='', req_who='',
withfullhistory=False): req_state=('new', 'review', 'declined'), req_type=None,
exclude_target_projects = exclude_target_projects or [] exclude_target_projects=None, withfullhistory=False, roles=None):
xpath = ''
if 'all' not in req_state:
for state in req_state:
xpath = xpath_join(xpath, 'state/@name=\'%s\'' % state, inner=True)
if req_who:
xpath = xpath_join(xpath, '(state/@who=\'%(who)s\' or history/@who=\'%(who)s\')' % {'who': req_who}, op='and')
# XXX: we cannot use the '|' in the xpath expression because it is not supported import warnings
# in the backend warnings.warn(
todo = {} "osc.core.get_request_list() is deprecated. "
if project: "Use osc.core.get_request_collection() instead.",
todo['project'] = project DeprecationWarning
if package: )
todo['package'] = package
for kind, val in todo.items():
xpath_base = 'action/target/@%(kind)s=\'%(val)s\''
if conf.config['include_request_from_project']:
xpath_base = xpath_join(xpath_base, 'action/source/@%(kind)s=\'%(val)s\'', op='or', inner=True)
xpath = xpath_join(xpath, xpath_base % {'kind': kind, 'val': val}, op='and', nexpr_parentheses=True)
if req_type: kwargs = {
xpath = xpath_join(xpath, 'action/@type=\'%s\'' % req_type, op='and') "apiurl": apiurl,
for i in exclude_target_projects: "user": req_who,
xpath = xpath_join(xpath, '(not(action/target/@project=\'%(prj)s\'))' % {'prj': i}, op='and') "roles": roles,
"project": project,
"package": package,
"states": req_state,
}
assert not exclude_target_projects, "unsupported"
assert not withfullhistory, "unsupported"
return get_request_collection(**kwargs)
if conf.config['debug']:
print('[ %s ]' % xpath)
queries = {}
if withfullhistory:
queries['request'] = {'withfullhistory': '1'}
res = search(apiurl, queries=queries, request=xpath)
collection = res['request']
requests = []
for root in collection.findall('request'):
r = Request()
r.read(root)
requests.append(r)
return requests
# old style search, this is to be removed # old style search, this is to be removed
def get_user_projpkgs_request_list(apiurl, user, req_state=('new', 'review', ), req_type=None, exclude_projects=None, projpkgs=None): def get_user_projpkgs_request_list(apiurl, user, req_state=('new', 'review', ), req_type=None, exclude_projects=None, projpkgs=None):
"""OBSOLETE: user involved request search is supported by OBS 2.2 server side in a better way """OBSOLETE: user involved request search is supported by OBS 2.2 server side in a better way
Return all running requests for all projects/packages where is user is involved""" Return all running requests for all projects/packages where is user is involved"""
@ -7545,14 +7567,14 @@ def get_commit_msg(wc_dir, pacs):
return msg return msg
def print_request_list(apiurl, project, package=None, states=('new', 'review', ), force=False): def print_request_list(apiurl, project, package=None, states=('new', 'review'), force=False):
""" """
prints list of pending requests for the specified project/package if "check_for_request_on_action" prints list of pending requests for the specified project/package if "check_for_request_on_action"
is enabled in the config or if "force" is set to True is enabled in the config or if "force" is set to True
""" """
if not conf.config['check_for_request_on_action'] and not force: if not conf.config['check_for_request_on_action'] and not force:
return return
requests = get_request_list(apiurl, project, package, req_state=states) requests = get_request_collection(apiurl, project=project, package=package, states=states)
msg = '\nPending requests for %s: %s (%s)' msg = '\nPending requests for %s: %s (%s)'
if sys.stdout.isatty(): if sys.stdout.isatty():
msg = f'\033[1m{msg}\033[0m' msg = f'\033[1m{msg}\033[0m'

View File

@ -1,5 +1,5 @@
<collection matches="1"> <collection matches="1">
<request id="148023"> <request creator="creator" id="148023">
<action type="submit"> <action type="submit">
<source project="home:user:branches:some:project" package="common-two" rev="7"/> <source project="home:user:branches:some:project" package="common-two" rev="7"/>
<target project="some:project" package="common-two"/> <target project="some:project" package="common-two"/>

View File

@ -33,7 +33,7 @@ class TestCommit(OscTestCase):
exp='This file didn\'t change but\nis modified.\n', text=rev_dummy) exp='This file didn\'t change but\nis modified.\n', text=rev_dummy)
@POST('http://localhost/source/osctest/simple?comment=&cmd=commitfilelist&user=Admin', @POST('http://localhost/source/osctest/simple?comment=&cmd=commitfilelist&user=Admin',
file='testSimple_cfilesremote', expfile='testSimple_lfilelist') file='testSimple_cfilesremote', expfile='testSimple_lfilelist')
@GET('http://localhost/search/request?match=%28state%2F%40name%3D%27new%27+or+state%2F%40name%3D%27review%27%29+and+%28action%2Ftarget%2F%40project%3D%27osctest%27+or+action%2Fsource%2F%40project%3D%27osctest%27%29+and+%28action%2Ftarget%2F%40package%3D%27simple%27+or+action%2Fsource%2F%40package%3D%27simple%27%29', file='testOpenRequests') @GET('http://localhost/request?view=collection&project=osctest&package=simple&states=new%2Creview', file='testOpenRequests')
def test_simple(self): def test_simple(self):
"""a simple commit (only one modified file)""" """a simple commit (only one modified file)"""
self._change_to_pkg('simple') self._change_to_pkg('simple')
@ -57,7 +57,7 @@ class TestCommit(OscTestCase):
exp='added file\n', text=rev_dummy) exp='added file\n', text=rev_dummy)
@POST('http://localhost/source/osctest/add?comment=&cmd=commitfilelist&user=Admin', @POST('http://localhost/source/osctest/add?comment=&cmd=commitfilelist&user=Admin',
file='testAddfile_cfilesremote', expfile='testAddfile_lfilelist') file='testAddfile_cfilesremote', expfile='testAddfile_lfilelist')
@GET('http://localhost/search/request?match=%28state%2F%40name%3D%27new%27+or+state%2F%40name%3D%27review%27%29+and+%28action%2Ftarget%2F%40project%3D%27osctest%27+or+action%2Fsource%2F%40project%3D%27osctest%27%29+and+%28action%2Ftarget%2F%40package%3D%27add%27+or+action%2Fsource%2F%40package%3D%27add%27%29', file='testOpenRequests') @GET('http://localhost/request?view=collection&project=osctest&package=add&states=new%2Creview', file='testOpenRequests')
def test_addfile(self): def test_addfile(self):
"""commit a new file""" """commit a new file"""
self._change_to_pkg('add') self._change_to_pkg('add')
@ -79,7 +79,7 @@ class TestCommit(OscTestCase):
exp='', text='<services />') exp='', text='<services />')
@POST('http://localhost/source/osctest/delete?comment=&cmd=commitfilelist&user=Admin&withvalidate=1', @POST('http://localhost/source/osctest/delete?comment=&cmd=commitfilelist&user=Admin&withvalidate=1',
file='testDeletefile_cfilesremote', expfile='testDeletefile_lfilelist') file='testDeletefile_cfilesremote', expfile='testDeletefile_lfilelist')
@GET('http://localhost/search/request?match=%28state%2F%40name%3D%27new%27+or+state%2F%40name%3D%27review%27%29+and+%28action%2Ftarget%2F%40project%3D%27osctest%27+or+action%2Fsource%2F%40project%3D%27osctest%27%29+and+%28action%2Ftarget%2F%40package%3D%27delete%27+or+action%2Fsource%2F%40package%3D%27delete%27%29', file='testOpenRequests') @GET('http://localhost/request?view=collection&project=osctest&package=delete&states=new%2Creview', file='testOpenRequests')
def test_deletefile(self): def test_deletefile(self):
"""delete a file""" """delete a file"""
self._change_to_pkg('delete') self._change_to_pkg('delete')
@ -132,7 +132,7 @@ class TestCommit(OscTestCase):
@PUT('http://localhost/source/osctest/multiple/add2?rev=repository', exp='add2\n', text=rev_dummy) @PUT('http://localhost/source/osctest/multiple/add2?rev=repository', exp='add2\n', text=rev_dummy)
@POST('http://localhost/source/osctest/multiple?comment=&cmd=commitfilelist&user=Admin', @POST('http://localhost/source/osctest/multiple?comment=&cmd=commitfilelist&user=Admin',
file='testMultiple_cfilesremote', expfile='testMultiple_lfilelist') file='testMultiple_cfilesremote', expfile='testMultiple_lfilelist')
@GET('http://localhost/search/request?match=%28state%2F%40name%3D%27new%27+or+state%2F%40name%3D%27review%27%29+and+%28action%2Ftarget%2F%40project%3D%27osctest%27+or+action%2Fsource%2F%40project%3D%27osctest%27%29+and+%28action%2Ftarget%2F%40package%3D%27multiple%27+or+action%2Fsource%2F%40package%3D%27multiple%27%29', file='testOpenRequests') @GET('http://localhost/request?view=collection&project=osctest&package=multiple&states=new%2Creview', file='testOpenRequests')
def test_multiple(self): def test_multiple(self):
"""a simple commit (only one modified file)""" """a simple commit (only one modified file)"""
self._change_to_pkg('multiple') self._change_to_pkg('multiple')
@ -161,7 +161,7 @@ class TestCommit(OscTestCase):
@PUT('http://localhost/source/osctest/multiple/nochange?rev=repository', exp='This file did change.\n', text=rev_dummy) @PUT('http://localhost/source/osctest/multiple/nochange?rev=repository', exp='This file did change.\n', text=rev_dummy)
@POST('http://localhost/source/osctest/multiple?comment=&cmd=commitfilelist&user=Admin', @POST('http://localhost/source/osctest/multiple?comment=&cmd=commitfilelist&user=Admin',
file='testPartial_cfilesremote', expfile='testPartial_lfilelist') file='testPartial_cfilesremote', expfile='testPartial_lfilelist')
@GET('http://localhost/search/request?match=%28state%2F%40name%3D%27new%27+or+state%2F%40name%3D%27review%27%29+and+%28action%2Ftarget%2F%40project%3D%27osctest%27+or+action%2Fsource%2F%40project%3D%27osctest%27%29+and+%28action%2Ftarget%2F%40package%3D%27multiple%27+or+action%2Fsource%2F%40package%3D%27multiple%27%29', file='testOpenRequests') @GET('http://localhost/request?view=collection&project=osctest&package=multiple&states=new%2Creview', file='testOpenRequests')
def test_partial(self): def test_partial(self):
"""commit only some files""" """commit only some files"""
self._change_to_pkg('multiple') self._change_to_pkg('multiple')
@ -208,7 +208,7 @@ class TestCommit(OscTestCase):
@PUT('http://localhost/source/osctest/allstates/nochange?rev=repository', exp='This file did change.\n', text=rev_dummy) @PUT('http://localhost/source/osctest/allstates/nochange?rev=repository', exp='This file did change.\n', text=rev_dummy)
@POST('http://localhost/source/osctest/allstates?comment=&cmd=commitfilelist&user=Admin', @POST('http://localhost/source/osctest/allstates?comment=&cmd=commitfilelist&user=Admin',
file='testAllStates_cfilesremote', expfile='testAllStates_lfilelist') file='testAllStates_cfilesremote', expfile='testAllStates_lfilelist')
@GET('http://localhost/search/request?match=%28state%2F%40name%3D%27new%27+or+state%2F%40name%3D%27review%27%29+and+%28action%2Ftarget%2F%40project%3D%27osctest%27+or+action%2Fsource%2F%40project%3D%27osctest%27%29+and+%28action%2Ftarget%2F%40package%3D%27allstates%27+or+action%2Fsource%2F%40package%3D%27allstates%27%29', file='testOpenRequests') @GET('http://localhost/request?view=collection&project=osctest&package=allstates&states=new%2Creview', file='testOpenRequests')
def test_allstates(self): def test_allstates(self):
"""commit all files (all states are available except 'C')""" """commit all files (all states are available except 'C')"""
self._change_to_pkg('allstates') self._change_to_pkg('allstates')
@ -234,7 +234,7 @@ class TestCommit(OscTestCase):
exp='', text='<services />') exp='', text='<services />')
@POST('http://localhost/source/osctest/add?comment=&cmd=commitfilelist&user=Admin&withvalidate=1', @POST('http://localhost/source/osctest/add?comment=&cmd=commitfilelist&user=Admin&withvalidate=1',
file='testAddfile_cfilesremote', expfile='testAddfile_lfilelist') file='testAddfile_cfilesremote', expfile='testAddfile_lfilelist')
@GET('http://localhost/search/request?match=%28state%2F%40name%3D%27new%27+or+state%2F%40name%3D%27review%27%29+and+%28action%2Ftarget%2F%40project%3D%27osctest%27+or+action%2Fsource%2F%40project%3D%27osctest%27%29+and+%28action%2Ftarget%2F%40package%3D%27add%27+or+action%2Fsource%2F%40package%3D%27add%27%29', file='testOpenRequests') @GET('http://localhost/request?view=collection&project=osctest&package=add&states=new%2Creview', file='testOpenRequests')
def test_remoteexists(self): def test_remoteexists(self):
"""file 'add' should be committed but already exists on the server""" """file 'add' should be committed but already exists on the server"""
self._change_to_pkg('add') self._change_to_pkg('add')
@ -260,7 +260,7 @@ class TestCommit(OscTestCase):
@POST('http://localhost/source/osctest/branch?comment=&cmd=commitfilelist&user=Admin&keeplink=1', @POST('http://localhost/source/osctest/branch?comment=&cmd=commitfilelist&user=Admin&keeplink=1',
file='testExpand_cfilesremote', expfile='testExpand_lfilelist') file='testExpand_cfilesremote', expfile='testExpand_lfilelist')
@GET('http://localhost/source/osctest/branch?rev=87ea02aede261b0267aabaa97c756e7a', file='testExpand_expandedfilesremote') @GET('http://localhost/source/osctest/branch?rev=87ea02aede261b0267aabaa97c756e7a', file='testExpand_expandedfilesremote')
@GET('http://localhost/search/request?match=%28state%2F%40name%3D%27new%27+or+state%2F%40name%3D%27review%27%29+and+%28action%2Ftarget%2F%40project%3D%27osctest%27+or+action%2Fsource%2F%40project%3D%27osctest%27%29+and+%28action%2Ftarget%2F%40package%3D%27branch%27+or+action%2Fsource%2F%40package%3D%27branch%27%29', file='testOpenRequests') @GET('http://localhost/request?view=collection&project=osctest&package=branch&states=new%2Creview', file='testOpenRequests')
def test_expand(self): def test_expand(self):
"""commit an expanded package""" """commit an expanded package"""
self._change_to_pkg('branch') self._change_to_pkg('branch')
@ -292,7 +292,7 @@ class TestCommit(OscTestCase):
@PUT('http://localhost/source/osctest/added_missing/bar?rev=repository', exp='foobar\n', text=rev_dummy) @PUT('http://localhost/source/osctest/added_missing/bar?rev=repository', exp='foobar\n', text=rev_dummy)
@POST('http://localhost/source/osctest/added_missing?comment=&cmd=commitfilelist&user=Admin', @POST('http://localhost/source/osctest/added_missing?comment=&cmd=commitfilelist&user=Admin',
file='testAddedMissing_cfilesremote', expfile='testAddedMissing_lfilelist') file='testAddedMissing_cfilesremote', expfile='testAddedMissing_lfilelist')
@GET('http://localhost/search/request?match=%28state%2F%40name%3D%27new%27+or+state%2F%40name%3D%27review%27%29+and+%28action%2Ftarget%2F%40project%3D%27osctest%27+or+action%2Fsource%2F%40project%3D%27osctest%27%29+and+%28action%2Ftarget%2F%40package%3D%27added_missing%27+or+action%2Fsource%2F%40package%3D%27added_missing%27%29', file='testOpenRequests') @GET('http://localhost/request?view=collection&project=osctest&package=added_missing&states=new%2Creview', file='testOpenRequests')
def test_added_missing2(self): def test_added_missing2(self):
"""commit an added file, another added file missing (but it's not part of the commit)""" """commit an added file, another added file missing (but it's not part of the commit)"""
self._change_to_pkg('added_missing') self._change_to_pkg('added_missing')
@ -334,7 +334,7 @@ class TestCommit(OscTestCase):
exp='This file didn\'t change but\nis modified.\n', text=rev_dummy) exp='This file didn\'t change but\nis modified.\n', text=rev_dummy)
@POST('http://localhost/source/osctest/simple?comment=&cmd=commitfilelist&user=Admin', @POST('http://localhost/source/osctest/simple?comment=&cmd=commitfilelist&user=Admin',
file='testSimple_cfilesremote', expfile='testSimple_lfilelistwithSHA') file='testSimple_cfilesremote', expfile='testSimple_lfilelistwithSHA')
@GET('http://localhost/search/request?match=%28state%2F%40name%3D%27new%27+or+state%2F%40name%3D%27review%27%29+and+%28action%2Ftarget%2F%40project%3D%27osctest%27+or+action%2Fsource%2F%40project%3D%27osctest%27%29+and+%28action%2Ftarget%2F%40package%3D%27simple%27+or+action%2Fsource%2F%40package%3D%27simple%27%29', file='testOpenRequests') @GET('http://localhost/request?view=collection&project=osctest&package=simple&states=new%2Creview', file='testOpenRequests')
def test_simple_sha256(self): def test_simple_sha256(self):
"""a simple commit (only one modified file)""" """a simple commit (only one modified file)"""
self._change_to_pkg('simple') self._change_to_pkg('simple')
@ -359,7 +359,7 @@ class TestCommit(OscTestCase):
@PUT('http://localhost/source/osctest/added_missing/bar?rev=repository', exp='foobar\n', text=rev_dummy) @PUT('http://localhost/source/osctest/added_missing/bar?rev=repository', exp='foobar\n', text=rev_dummy)
@POST('http://localhost/source/osctest/added_missing?comment=&cmd=commitfilelist&user=Admin', @POST('http://localhost/source/osctest/added_missing?comment=&cmd=commitfilelist&user=Admin',
file='testAddedMissing_cfilesremote', expfile='testAddedMissing_lfilelistwithSHA') file='testAddedMissing_cfilesremote', expfile='testAddedMissing_lfilelistwithSHA')
@GET('http://localhost/search/request?match=%28state%2F%40name%3D%27new%27+or+state%2F%40name%3D%27review%27%29+and+%28action%2Ftarget%2F%40project%3D%27osctest%27+or+action%2Fsource%2F%40project%3D%27osctest%27%29+and+%28action%2Ftarget%2F%40package%3D%27added_missing%27+or+action%2Fsource%2F%40package%3D%27added_missing%27%29', file='testOpenRequests') @GET('http://localhost/request?view=collection&project=osctest&package=added_missing&states=new%2Creview', file='testOpenRequests')
def test_added_missing2_sha256(self): def test_added_missing2_sha256(self):
"""commit an added file, another added file missing (but it's not part of the commit)""" """commit an added file, another added file missing (but it's not part of the commit)"""
self._change_to_pkg('added_missing') self._change_to_pkg('added_missing')

View File

@ -0,0 +1,40 @@
import unittest
from osc.core import Request
class TestRequest(unittest.TestCase):
def test_eq(self):
req1 = Request()
req1.reqid = 1
req2 = Request()
req2.reqid = 1
self.assertEqual(req1, req2)
def test_lt(self):
req1 = Request()
req1.reqid = 1
req2 = Request()
req2.reqid = 2
self.assertTrue(req1 < req2)
def test_gt(self):
req1 = Request()
req1.reqid = 2
req2 = Request()
req2.reqid = 1
self.assertTrue(req1 > req2)
def test_sort(self):
req1 = Request()
req1.reqid = 2
req2 = Request()
req2.reqid = 1
requests = [req1, req2]
requests.sort()
self.assertEqual(requests[0].reqid, 1)
self.assertEqual(requests[1].reqid, 2)
if __name__ == "__main__":
unittest.main()

View File

@ -21,8 +21,7 @@ def rdiff_url(pkg, oldprj, newprj):
def request_url(prj): def request_url(prj):
return 'http://localhost/search/request?match=%%28state%%2F%%40name%%3D%%27new%%27+or+state%%2F%%40name%%3D%%27review%%27%%29+and+%%28action%%2Ftarget%%2F%%40project%%3D%%27%s%%27+or+action%%2Fsource%%2F%%40project%%3D%%27%s%%27%%29' % \ return "http://localhost/request" + f"?view=collection&project={prj}&states=new,review".replace(":", "%3A").replace(",", "%2C")
tuple([prj.replace(':', '%3A')] * 2)
def GET_PROJECT_PACKAGES(*projects): def GET_PROJECT_PACKAGES(*projects):
@ -225,6 +224,7 @@ identical: common-three
differs: common-two differs: common-two
148023 State:new By:user When:2013-01-11T11:04:14 148023 State:new By:user When:2013-01-11T11:04:14
Created by: creator
submit: home:user:branches:some:project/common-two@7 -> some:project submit: home:user:branches:some:project/common-two@7 -> some:project
Descr: - Fix it to work - Improve support for something Descr: - Fix it to work - Improve support for something

View File

@ -432,6 +432,7 @@ class TestRequest(OscTestCase):
xml = self._get_fixture('test_request_list_view1.xml') xml = self._get_fixture('test_request_list_view1.xml')
exp = """\ exp = """\
62 State:new By:Admin When:2010-12-29T14:57:25 62 State:new By:Admin When:2010-12-29T14:57:25
Created by: Admin
set_bugowner: buguser foo set_bugowner: buguser foo
add_role: person: xyz as maintainer, group: group1 as reader foobar add_role: person: xyz as maintainer, group: group1 as reader foobar
add_role: person: abc as reviewer foo/bar add_role: person: abc as reviewer foo/bar
@ -451,6 +452,7 @@ class TestRequest(OscTestCase):
r.read(ET.fromstring(xml)) r.read(ET.fromstring(xml))
exp = """\ exp = """\
21 State:accepted By:foobar When:2010-12-29T16:37:45 21 State:accepted By:foobar When:2010-12-29T16:37:45
Created by: foobar
set_bugowner: buguser foo set_bugowner: buguser foo
From: Created Request: user -> Review Approved: foobar From: Created Request: user -> Review Approved: foobar
Descr: This is a simple request with a lot of ... ... text and other Descr: This is a simple request with a lot of ... ... text and other
@ -466,28 +468,32 @@ class TestRequest(OscTestCase):
r.read(ET.fromstring(xml)) r.read(ET.fromstring(xml))
self.assertEqual(r.creator, 'creator') self.assertEqual(r.creator, 'creator')
exp = """\ exp = """\
Request: #123 Request: 123
Created by: creator
Actions:
submit: xyz/abc(cleanup) -> foo ***update link*** submit: xyz/abc(cleanup) -> foo ***update link***
add_role: person: bar as maintainer, group: groupxyz as reader home:foo add_role: person: bar as maintainer, group: groupxyz as reader home:foo
Message: Message:
just a samll description just a samll description
in order to describe this in order to describe this
request - blablabla request - blablabla
test. test.
State: review 2010-12-27T01:36:29 abc State:
Comment: currently in review review 2010-12-27T01:36:29 abc
| currently in review
Review: accepted Group: group1 2010-12-29T00:11:22 abc Review:
accepted accepted Group: group1 2010-12-29T00:11:22 abc
new Group: group1 2010-12-28T00:11:22 abc | accepted
review start new Group: group1 2010-12-28T00:11:22 abc
| review start
History: 2010-12-12T00:00:00 creator revoked History:
2010-12-11T00:00:00 creator new""" 2010-12-12T00:00:00 creator revoked
2010-12-11T00:00:00 creator new"""
self.assertEqual(exp, str(r)) self.assertEqual(exp, str(r))
def test_request_str2(self): def test_request_str2(self):
@ -507,17 +513,18 @@ History: 2010-12-12T00:00:00 creator revoked
r.read(ET.fromstring(xml)) r.read(ET.fromstring(xml))
self.assertEqual(r.creator, 'creator') self.assertEqual(r.creator, 'creator')
exp = """\ exp = """\
Request: #98765 Request: 98765
Created by: creator
Actions:
change_devel: foo/bar developed in devprj/devpkg change_devel: foo/bar developed in devprj/devpkg
delete: deleteme delete: deleteme
Message: Message:
<no message> <no message>
State: new 2010-12-29T00:11:22 creator State:
Comment: <no comment>""" new 2010-12-29T00:11:22 creator"""
self.assertEqual(exp, str(r)) self.assertEqual(exp, str(r))
def test_legacy_request(self): def test_legacy_request(self):