mirror of
https://github.com/openSUSE/osc.git
synced 2024-11-15 00:36:11 +01:00
83 lines
2.5 KiB
Python
83 lines
2.5 KiB
Python
|
import difflib
|
||
|
|
||
|
import osc.commandline
|
||
|
from .. import oscerr
|
||
|
from .._private.project import ProjectMeta
|
||
|
from ..core import raw_input
|
||
|
|
||
|
|
||
|
class RepoAddCommand(osc.commandline.OscCommand):
|
||
|
"""
|
||
|
Add a repository to project meta
|
||
|
"""
|
||
|
|
||
|
name = "add"
|
||
|
parent = "RepoCommand"
|
||
|
|
||
|
def init_arguments(self):
|
||
|
self.add_argument(
|
||
|
"project",
|
||
|
help="Name of the project",
|
||
|
)
|
||
|
self.add_argument(
|
||
|
"--repo",
|
||
|
metavar="NAME",
|
||
|
required=True,
|
||
|
help="Name of the repository we're adding",
|
||
|
)
|
||
|
self.add_argument(
|
||
|
"--arch",
|
||
|
dest="arches",
|
||
|
metavar="[ARCH]",
|
||
|
action="append",
|
||
|
required=True,
|
||
|
help="Architecture of the repository. Can be specified multiple times.",
|
||
|
)
|
||
|
self.add_argument(
|
||
|
"--path",
|
||
|
dest="paths",
|
||
|
metavar="[PROJECT/REPO]",
|
||
|
action="append",
|
||
|
required=True,
|
||
|
help="Path associated to the repository. Format is PROJECT/REPO. Can be specified multiple times.",
|
||
|
)
|
||
|
self.add_argument(
|
||
|
"--disable-publish",
|
||
|
action="store_true",
|
||
|
default=False,
|
||
|
help="Disable publishing the added repository",
|
||
|
)
|
||
|
self.add_argument(
|
||
|
"--yes",
|
||
|
action="store_true",
|
||
|
help="Proceed without asking",
|
||
|
)
|
||
|
|
||
|
def run(self, args):
|
||
|
paths = []
|
||
|
for path in args.paths:
|
||
|
if "/" not in path:
|
||
|
self.parser.error(f"Invalid path (expected format is PROJECT/REPO): {path}")
|
||
|
project, repo = path.split("/")
|
||
|
paths.append({"project": project, "repository": repo})
|
||
|
|
||
|
meta = ProjectMeta.from_api(args.apiurl, args.project)
|
||
|
old_meta = meta.to_string().splitlines()
|
||
|
|
||
|
meta.repository_add(args.repo, args.arches, paths)
|
||
|
if args.disable_publish:
|
||
|
meta.publish_add_disable_repository(args.repo)
|
||
|
|
||
|
new_meta = meta.to_string().splitlines()
|
||
|
diff = difflib.unified_diff(old_meta, new_meta, fromfile="old", tofile="new")
|
||
|
print("\n".join(diff))
|
||
|
|
||
|
if not args.yes:
|
||
|
print()
|
||
|
print(f"You're changing meta of project '{args.project}'")
|
||
|
reply = raw_input("Do you want to apply the changes? [y/N] ").lower()
|
||
|
if reply != "y":
|
||
|
raise oscerr.UserAbort()
|
||
|
|
||
|
meta.to_api(args.apiurl, args.project)
|