From 3a47690cfd458647a87ef90b4da57578a608254f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lorenz=20H=C3=BCdepohl?= <lorenz.huedepohl@rzg.mpg.de>
Date: Wed, 21 Mar 2018 10:45:23 +0100
Subject: [PATCH] New command 'mpcdf_set_as_branch'

This turns a package into a branch of another package, after the fact.
---
 mpcdf_common.py        | 40 +++++++++++++++++++++++++++++++
 mpcdf_set_as_branch.py | 54 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 94 insertions(+)
 create mode 100644 mpcdf_set_as_branch.py

diff --git a/mpcdf_common.py b/mpcdf_common.py
index b68db03..31a7d68 100644
--- a/mpcdf_common.py
+++ b/mpcdf_common.py
@@ -330,3 +330,43 @@ def mpcdf_setup_repositories(api_url, project, distribution=None, parent=None, p
         osc.core.edit_meta("prj", project, data=prj)
         print("Updating prjconf meta")
         osc.core.edit_meta("prjconf", project, data=prjconf)
+
+
+def set_as_branch(api_url, my_project, my_package, main_project, main_package):
+    import os
+
+    def dirmeta(project, package):
+        url = osc.core.makeurl(api_url, ["source", project, package])
+        return ElementTree.fromstringlist(osc.core.streamfile(url, osc.core.http_GET))
+
+    srcmeta = dirmeta(my_project, my_package)
+    dstmeta = dirmeta(main_project, main_package)
+
+    linkinfo = srcmeta.find('./linkinfo')
+    if linkinfo is not None:
+        print("ERROR: package {0} is already linked to package {1} in project {2}".format(
+              my_package, linkinfo.get("package"), linkinfo.get("project")))
+        return False
+
+    linkfile = ElementTree.Element("link")
+    linkfile.set("project", main_project)
+    linkfile.set("package", main_package)
+    linkfile.set("baserev", dstmeta.get("srcmd5"))
+    patches = ElementTree.SubElement(linkfile, "patches")
+    ElementTree.SubElement(patches, "branch")
+
+    url = osc.core.makeurl(api_url, ["source", my_project, my_package, "_link"])
+    resp = ElementTree.fromstringlist(osc.core.streamfile(url, osc.core.http_PUT, data=ElementTree.tostring(linkfile)))
+    rev = resp.get("rev")
+    if rev is None:
+        print("ERROR: Could not commit _link file")
+        return False
+    else:
+        print("Commited as revision", rev)
+        this_package = osc.core.store_read_package(os.curdir)
+        this_project = osc.core.store_read_project(os.curdir)
+        if this_package == my_package and this_project == my_project:
+            pac = osc.core.filedir_to_pac(os.curdir)
+            rev = pac.latest_rev(expand=True)
+            pac.update(rev)
+    return True
diff --git a/mpcdf_set_as_branch.py b/mpcdf_set_as_branch.py
new file mode 100644
index 0000000..a29ca94
--- /dev/null
+++ b/mpcdf_set_as_branch.py
@@ -0,0 +1,54 @@
+#!/usr/bin/python2
+from __future__ import print_function
+
+import mpcdf_common
+
+import os
+import osc
+import osc.conf
+import osc.core
+import osc.cmdln
+
+
+def do_mpcdf_set_as_branch(self, subcmd, opts, *args):
+    """${cmd_name}: Convert a package to be a branch of another
+
+    The package MY_PACKAGE is set-up to be a branch of the package
+    MAIN_PACKAGE
+
+    The currently checked out package is used as MY_PACKAGE, if that
+    argument is omitted, and MAIN_PACKAGE is assumed to have the same name as
+    MY_PACKAGE, of omitted.
+
+    Usage:
+        osc mpcdf_set_as_branch MAIN_PROJECT [MAIN_PACKAGE]
+        osc mpcdf_set_as_branch MY_PROJECT MY_PACKAGE MAIN_PROJECT [MAIN_PACKAGE]
+
+    ${cmd_option_list}
+    """
+    if len(args) < 1:
+        raise osc.oscerr.WrongArgs("Not enough arguments")
+    if len(args) == 1:
+        main_project, = args
+        main_package = None
+    if len(args) == 2:
+        main_project, main_package = args
+    if len(args) in [1, 2]:
+        if osc.core.is_package_dir(os.curdir):
+            my_package = osc.core.store_read_package(os.curdir)
+            my_project = osc.core.store_read_project(os.curdir)
+        else:
+            raise osc.oscerr.WrongArgs('Specify MY_PROJECT and MY_PACKAGE or run command in an osc package checkout directory')
+        if main_package is None:
+            main_package = my_package
+
+    if len(args) == 3:
+        my_project, my_package, main_project = args
+        main_package = my_package
+    if len(args) == 4:
+        my_project, my_package, main_project, main_package = args
+    elif len(args) > 4:
+        raise osc.oscerr.WrongArgs("Too many arguments")
+
+    if not mpcdf_common.set_as_branch(self.get_api_url(), my_project, my_package, main_project, main_package):
+        raise SystemExit(1)
-- 
GitLab