From abec6e5eb5f1fb56a50fa935c420ad762cb4c11b Mon Sep 17 00:00:00 2001 From: Daniel Mach Date: Fri, 12 Apr 2024 16:49:49 +0200 Subject: [PATCH] Fix 'branch' command to allow using '--new-package' option on packages that do not exist --- behave/container-setup-initial-data.sh | 26 ++++++++ behave/features/branch.feature | 65 +++++++++++++++++++ behave/features/list.feature | 3 + behave/features/repo.feature | 4 +- behave/features/token.feature | 1 + behave/features/undelete.feature | 5 +- behave/fixtures/prj/test_factory_update.xml | 25 +++++++ behave/fixtures/prj/test_leap_15.6.xml | 24 +++++++ behave/fixtures/prj/test_leap_15.6_update.xml | 25 +++++++ osc/core.py | 14 ++-- 10 files changed, 184 insertions(+), 8 deletions(-) create mode 100644 behave/features/branch.feature create mode 100644 behave/fixtures/prj/test_factory_update.xml create mode 100644 behave/fixtures/prj/test_leap_15.6.xml create mode 100644 behave/fixtures/prj/test_leap_15.6_update.xml diff --git a/behave/container-setup-initial-data.sh b/behave/container-setup-initial-data.sh index 283fc0fc..e2bb9745 100644 --- a/behave/container-setup-initial-data.sh +++ b/behave/container-setup-initial-data.sh @@ -19,7 +19,15 @@ OSC="osc -A https://localhost" # create projects $OSC api -X PUT '/source/openSUSE.org/_meta' --file "$FIXTURES_DIR/prj/openSUSE.org.xml" $OSC api -X PUT '/source/test:devel/_meta' --file "$FIXTURES_DIR/prj/test_devel.xml" + +# test:factory:update inherits from test:factory; test:factory has test:devel devel project $OSC api -X PUT '/source/test:factory/_meta' --file "$FIXTURES_DIR/prj/test_factory.xml" +$OSC api -X PUT '/source/test:factory:update/_meta' --file "$FIXTURES_DIR/prj/test_factory_update.xml" + +# test:leap:15.6:update inherits from test:leap:15.6; test:leap:15.6 has no devel project +$OSC api -X PUT '/source/test:leap:15.6/_meta' --file "$FIXTURES_DIR/prj/test_leap_15.6.xml" +$OSC api -X PUT '/source/test:leap:15.6:update/_meta' --file "$FIXTURES_DIR/prj/test_leap_15.6_update.xml" + $OSC api -X PUT '/source/test:release/_meta' --file "$FIXTURES_DIR/prj/test_release.xml" $OSC api -X PUT '/source/home:Admin/_meta' --file "$FIXTURES_DIR/prj/home_Admin.xml" @@ -92,6 +100,24 @@ $OSC commit -m 'Initial commit' rm -rf "$TMP_DIR" +# create package 'test:leap:15.6/test-pkgA' +TMP_DIR=$(mktemp -d) +cd "$TMP_DIR" + +$OSC checkout test:leap:15.6 +cd "$_" + +$OSC mkpac test-pkgA +cd "$_" + +cp "$FIXTURES_DIR/pac/test-pkgA-1.spec" test-pkgA.spec +cp "$FIXTURES_DIR/pac/test-pkgA-1.changes" test-pkgA.changes +$OSC add test-pkgA.spec test-pkgA.changes +$OSC commit -m 'Initial commit' + +rm -rf "$TMP_DIR" + + # create package 'test:devel/test-pkgA' TMP_DIR=$(mktemp -d) cd "$TMP_DIR" diff --git a/behave/features/branch.feature b/behave/features/branch.feature new file mode 100644 index 00000000..806e8bc9 --- /dev/null +++ b/behave/features/branch.feature @@ -0,0 +1,65 @@ +Feature: `osc branch` command + + +@destructive +Scenario: Run `osc branch` on an inherited package that has no devel project set + When I execute osc with args "branch test:leap:15.6:update/test-pkgA" + Then the exit code is 0 + And I execute osc with args "api /source/home:Admin:branches:test:leap:15.6/test-pkgA/_link" + And stdout contains "/` @destructive Scenario: Run `osc undelete ` - Given I execute osc with args "rdelete test:factory --recursive -m 'why:delete'" - When I execute osc with args "undelete test:factory -m 'why:undelete'" + Given I execute osc with args "rdelete test:factory:update --recursive -m 'why:delete'" + And the exit code is 0 + When I execute osc with args "undelete test:factory:update -m 'why:undelete'" Then the exit code is 0 diff --git a/behave/fixtures/prj/test_factory_update.xml b/behave/fixtures/prj/test_factory_update.xml new file mode 100644 index 00000000..5df51d11 --- /dev/null +++ b/behave/fixtures/prj/test_factory_update.xml @@ -0,0 +1,25 @@ + + + + <description/> + + <link project="test:factory"/> + + <person userid="Admin" role="maintainer"/> + + <lock> + <disable/> + </lock> + + <build> + <disable/> + </build> + + <repository name="standard"> + <path project="test:factory" repository="standard"/> + <arch>x86_64</arch> + <arch>i586</arch> + </repository> + +</project> + diff --git a/behave/fixtures/prj/test_leap_15.6.xml b/behave/fixtures/prj/test_leap_15.6.xml new file mode 100644 index 00000000..ef62212a --- /dev/null +++ b/behave/fixtures/prj/test_leap_15.6.xml @@ -0,0 +1,24 @@ +<project name="test:leap:15.6"> + + <title/> + <description/> + + <person userid="Admin" role="maintainer"/> + + <lock> + <disable/> + </lock> + + <build> + <disable/> + </build> + + <repository name="standard"> + <!-- it's only for test purposes, let's use the same repo as test:factory --> + <path project="openSUSE.org:openSUSE:Tumbleweed" repository="standard"/> + <arch>x86_64</arch> + <arch>i586</arch> + </repository> + +</project> + diff --git a/behave/fixtures/prj/test_leap_15.6_update.xml b/behave/fixtures/prj/test_leap_15.6_update.xml new file mode 100644 index 00000000..e4c82016 --- /dev/null +++ b/behave/fixtures/prj/test_leap_15.6_update.xml @@ -0,0 +1,25 @@ +<project name="test:leap:15.6:update"> + + <title/> + <description/> + + <link project="test:leap:15.6"/> + + <person userid="Admin" role="maintainer"/> + + <lock> + <disable/> + </lock> + + <build> + <disable/> + </build> + + <repository name="standard"> + <path project="test:leap:15.6" repository="standard"/> + <arch>x86_64</arch> + <arch>i586</arch> + </repository> + +</project> + diff --git a/osc/core.py b/osc/core.py index 7f46be39..1af0f94c 100644 --- a/osc/core.py +++ b/osc/core.py @@ -6107,12 +6107,18 @@ def branch_pkg( # BEGIN: Error out on branching scmsync packages; this should be properly handled in the API # read src_package meta - m = b"".join(show_package_meta(apiurl, src_project, src_package)) - root = ET.fromstring(m) + try: + m = b"".join(show_package_meta(apiurl, src_project, src_package)) + root = ET.fromstring(m) + except HTTPError as e: + if e.code == 404 and missingok: + root = None + else: + raise devel_project = None devel_package = None - if not nodevelproject: + if root is not None and not nodevelproject: devel_node = root.find("devel") if devel_node is not None: devel_project = devel_node.get("project") @@ -6123,7 +6129,7 @@ def branch_pkg( root = ET.fromstring(m) # error out if we're branching a scmsync package (we'd end up with garbage anyway) - if root.find("scmsync") is not None: + if root is not None and root.find("scmsync") is not None: msg = "Cannot branch a package with <scmsync> set." if devel_project: raise oscerr.PackageError(devel_project, devel_package, msg)