Changeset View
Changeset View
Standalone View
Standalone View
swh/model/cli.py
# Copyright (C) 2018 The Software Heritage developers | # Copyright (C) 2018 The Software Heritage developers | ||||
# See the AUTHORS file at the top-level directory of this distribution | # See the AUTHORS file at the top-level directory of this distribution | ||||
# License: GNU General Public License version 3, or any later version | # License: GNU General Public License version 3, or any later version | ||||
# See top-level LICENSE file for more information | # See top-level LICENSE file for more information | ||||
import click | import click | ||||
import os | import os | ||||
import sys | import sys | ||||
from functools import partial | from functools import partial | ||||
from swh.core.cli import CONTEXT_SETTINGS | |||||
from swh.model import identifiers as pids | from swh.model import identifiers as pids | ||||
from swh.model.exceptions import ValidationError | from swh.model.exceptions import ValidationError | ||||
from swh.model.from_disk import Content, Directory | from swh.model.from_disk import Content, Directory | ||||
class PidParamType(click.ParamType): | class PidParamType(click.ParamType): | ||||
name = 'persistent identifier' | name = 'persistent identifier' | ||||
Show All 37 Lines | def identify_object(obj_type, follow_symlinks, obj): | ||||
else: # shouldn't happen, due to option validation | else: # shouldn't happen, due to option validation | ||||
raise click.BadParameter('invalid object type: ' + obj_type) | raise click.BadParameter('invalid object type: ' + obj_type) | ||||
# note: we return original obj instead of path here, to preserve user-given | # note: we return original obj instead of path here, to preserve user-given | ||||
# file name in output | # file name in output | ||||
return (obj, pid) | return (obj, pid) | ||||
@click.command() | @click.command(context_settings=CONTEXT_SETTINGS) | ||||
@click.option('--dereference/--no-dereference', 'follow_symlinks', | @click.option('--dereference/--no-dereference', 'follow_symlinks', | ||||
default=True, | default=True, | ||||
help='follow (or not) symlinks for OBJECTS passed as arguments ' | help='follow (or not) symlinks for OBJECTS passed as arguments ' | ||||
+ '(default: follow)') | + '(default: follow)') | ||||
@click.option('--filename/--no-filename', 'show_filename', default=True, | @click.option('--filename/--no-filename', 'show_filename', default=True, | ||||
help='show/hide file name (default: show)') | help='show/hide file name (default: show)') | ||||
@click.option('--type', '-t', 'obj_type', default='auto', | @click.option('--type', '-t', 'obj_type', default='auto', | ||||
type=click.Choice(['auto', 'content', 'directory']), | type=click.Choice(['auto', 'content', 'directory']), | ||||
help='type of object to identify (default: auto)') | help='type of object to identify (default: auto)') | ||||
@click.option('--verify', '-v', metavar='PID', type=PidParamType(), | @click.option('--verify', '-v', metavar='PID', type=PidParamType(), | ||||
help='reference identifier to be compared with computed one') | help='reference identifier to be compared with computed one') | ||||
@click.argument('objects', nargs=-1, | @click.argument('objects', nargs=-1, required=True, | ||||
type=click.Path(exists=True, readable=True, | type=click.Path(exists=True, readable=True, | ||||
allow_dash=True, path_type=bytes)) | allow_dash=True, path_type=bytes)) | ||||
def identify(obj_type, verify, show_filename, follow_symlinks, objects): | def identify(obj_type, verify, show_filename, follow_symlinks, objects): | ||||
"""Compute the Software Heritage persistent identifier (PID) for the given | """Compute the Software Heritage persistent identifier (PID) for the given | ||||
source code object(s). | source code object(s). | ||||
For more details about Software Heritage PIDs see: | For more details about Software Heritage PIDs see: | ||||
\b | \b | ||||
https://docs.softwareheritage.org/devel/swh-model/persistent-identifiers.html | https://docs.softwareheritage.org/devel/swh-model/persistent-identifiers.html | ||||
\b | \b | ||||
Examples: | Examples: | ||||
\b | \b | ||||
$ swh-identify fork.c kmod.c sched/deadline.c | $ swh identify fork.c kmod.c sched/deadline.c | ||||
swh:1:cnt:2e391c754ae730bd2d8520c2ab497c403220c6e3 fork.c | swh:1:cnt:2e391c754ae730bd2d8520c2ab497c403220c6e3 fork.c | ||||
swh:1:cnt:0277d1216f80ae1adeed84a686ed34c9b2931fc2 kmod.c | swh:1:cnt:0277d1216f80ae1adeed84a686ed34c9b2931fc2 kmod.c | ||||
swh:1:cnt:57b939c81bce5d06fa587df8915f05affbe22b82 sched/deadline.c | swh:1:cnt:57b939c81bce5d06fa587df8915f05affbe22b82 sched/deadline.c | ||||
\b | \b | ||||
$ swh-identify --no-filename /usr/src/linux/kernel/ | $ swh identify --no-filename /usr/src/linux/kernel/ | ||||
swh:1:dir:f9f858a48d663b3809c9e2f336412717496202ab | swh:1:dir:f9f858a48d663b3809c9e2f336412717496202ab | ||||
""" | """ | ||||
if verify and len(objects) != 1: | if verify and len(objects) != 1: | ||||
raise click.BadParameter('verification requires a single object') | raise click.BadParameter('verification requires a single object') | ||||
results = map(partial(identify_object, obj_type, follow_symlinks), objects) | results = map(partial(identify_object, obj_type, follow_symlinks), objects) | ||||
Show All 18 Lines |