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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ x86_64
+ i586
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ x86_64
+ i586
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ x86_64
+ i586
+
+
+
+
diff --git a/osc/core.py b/osc/core.py
index 42a3ea84..7bba34cd 100644
--- a/osc/core.py
+++ b/osc/core.py
@@ -6126,12 +6126,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")
@@ -6142,7 +6148,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 set."
if devel_project:
raise oscerr.PackageError(devel_project, devel_package, msg)