|
| 1 | +#!/usr/bin/env python |
| 2 | + |
| 3 | +import argparse |
| 4 | +import json |
| 5 | +import logging |
| 6 | +import math |
| 7 | +import sys |
| 8 | +import urllib |
| 9 | +from blackduck.HubRestApi import HubInstance |
| 10 | + |
| 11 | +parser = argparse.ArgumentParser("Retrieve the source files - matched, unmatched, all - for a given project and version") |
| 12 | +parser.add_argument("project_name") |
| 13 | +parser.add_argument("version") |
| 14 | +parser.add_argument("-l", "--limit", type=int, default=100, help="Set the limit on the amount of matches to retrieve per call to the server") |
| 15 | + |
| 16 | +args = parser.parse_args() |
| 17 | + |
| 18 | +logging.basicConfig(format='%(asctime)s:%(levelname)s:%(message)s', stream=sys.stderr, level=logging.DEBUG) |
| 19 | +logging.getLogger("requests").setLevel(logging.WARNING) |
| 20 | +logging.getLogger("urllib3").setLevel(logging.WARNING) |
| 21 | + |
| 22 | +hub = HubInstance() |
| 23 | + |
| 24 | +version = hub.get_project_version_by_name(args.project_name, args.version) |
| 25 | + |
| 26 | +if not version: |
| 27 | + raise Exception(f"Did not find {args.version} in project {args.project_name}") |
| 28 | + |
| 29 | +everything = {'all_files': []} |
| 30 | +base_url = version['_meta']['href'] + "/matched-files" |
| 31 | + |
| 32 | +keys_and_parms = { |
| 33 | + 'matched_files': {}, |
| 34 | + 'un_matched_files': {'filter':'bomMatchType:unmatched'} |
| 35 | +} |
| 36 | + |
| 37 | +for key, parameters in keys_and_parms.items(): |
| 38 | + num_results_found = math.inf |
| 39 | + first = True |
| 40 | + offset = 0 |
| 41 | + |
| 42 | + while offset < num_results_found: |
| 43 | + parameters.update({ |
| 44 | + 'limit': args.limit, |
| 45 | + 'offset': offset |
| 46 | + }) |
| 47 | + parameter_string = "&".join([f"{k}={urllib.parse.quote(str(v))}" for k,v in parameters.items()]) |
| 48 | + url = base_url + f"?{parameter_string}" |
| 49 | + results = hub.execute_get(url).json() |
| 50 | + |
| 51 | + if first: |
| 52 | + first = False |
| 53 | + num_results_found = results['totalCount'] |
| 54 | + |
| 55 | + if key in everything: |
| 56 | + everything[key].extend(results.get('items', [])) |
| 57 | + else: |
| 58 | + everything[key] = results.get('items', []) |
| 59 | + |
| 60 | + offset += args.limit |
| 61 | + |
| 62 | + # Extend the list of all_files to include all the files in the set just created |
| 63 | + everything['all_files'].extend(everything[key].copy()) |
| 64 | + |
| 65 | +print(json.dumps(everything)) |
0 commit comments