summarylogtreecommitdiffstats
path: root/0002-Support-osc-copyprj-in-api-by-Islam-Amer-usage-osc-c.patch
blob: 0842fd650140ae7abb107027e77cd8512b1e3fe2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Marko Lemmetty <marko.lemmetty@jollamobile.com>
Date: Fri, 15 May 2020 14:20:54 +0300
Subject: [PATCH] Support 'osc copyprj' in api by Islam Amer usage: osc copyprj
 SOURCEPRJ DESTPRJ

    A way to copy a project and all packages in it
    It can not yet be done across buildservice instances
    The user must be able to create DESTPRJ
---
 osc/commandline.py | 52 ++++++++++++++++++++++++++++++++++++++++++++++
 osc/core.py        | 28 +++++++++++++++++++++++++
 2 files changed, 80 insertions(+)

diff --git a/osc/commandline.py b/osc/commandline.py
index 6159ccdac390828f95f55a9abd15559a0e08e327..d65eb6417d8aa219c1d2a0ac1ca6a9bbad6508da 100644
--- a/osc/commandline.py
+++ b/osc/commandline.py
@@ -2112,6 +2112,58 @@ class Osc(cmdln.Cmdln):
             else:
                 raise oscerr.WrongOptions('The --delete switch is only for pattern metadata or attributes.')
 
+    @cmdln.option('-b', '--with-binaries', action='store_true',
+                        help='copy the built binaries over to avoid a rebuild')
+    @cmdln.option('-H', '--with-history', action='store_true',
+                        help='replicate the history of each package.')
+    @cmdln.option('-o', '--make-older', action='store_true',
+                        help='No idea')
+    @cmdln.option('-r', '--re-sign', action='store_true',
+                        help='re-sign the binaries')
+    @cmdln.option('-m', '--message', metavar='TEXT',
+                  help='specify message TEXT')
+    def do_copyprj(self, subcmd, opts, *args):
+        """
+        Copy a project
+
+        A way to copy a project and all packages in it
+
+        It can not yet be done across buildservice instances
+
+        The user must be able to create DESTPRJ
+
+        usage:
+            osc copyprj SOURCEPRJ DESTPRJ
+        """
+
+        args = slash_split(args)
+
+        if not args or len(args) != 2:
+            raise oscerr.WrongArgs('Incorrect number of arguments.')
+
+        src_project = args[0]
+        dst_project = args[1]
+
+        src_apiurl = conf.config['apiurl']
+
+        if opts.message:
+            comment = opts.message
+        else:
+            comment = 'osc copyprj from project:%s' % ( src_project )
+
+        if src_project == dst_project:
+            raise oscerr.WrongArgs('Source and destination are the same.')
+
+        print("calling cp")
+        r = copy_prj(src_apiurl, src_project, dst_project,
+                     withbinaries = opts.with_binaries,
+                     withhistory = opts.with_history,
+                     makeolder = opts.make_older,
+                     resign = opts.re_sign,
+                     comment = comment)
+        print("done cp")
+        print(r)
+
     # TODO: rewrite and consolidate the current submitrequest/createrequest "mess"
 
     @cmdln.option('-m', '--message', metavar='TEXT',
diff --git a/osc/core.py b/osc/core.py
index 04bfcd943162bd92bf4ffe19ba002f9fbd8e2538..a5c7236f875b8816b375b9d5976b8a4bb8d5b6d8 100644
--- a/osc/core.py
+++ b/osc/core.py
@@ -6313,6 +6313,34 @@ def copy_pac(
             raise oscerr.APIError(f"failed to copy: {', '.join(todo)}")
         return 'Done.'
 
+def copy_prj(src_apiurl, src_project, dst_project,
+             withbinaries = False,
+             withhistory = False,
+             makeolder = False,
+             resign = False,
+             comment = None):
+    """
+    Create a copy of a project.
+
+    Copying can only be done on the server, in a single api call.
+    """
+
+    print('Copying project...')
+    query = {'cmd': 'copy', 'oproject': src_project }
+    if withbinaries:
+        query['withbinaries'] = '1'
+    if withhistory:
+        query['withhistory'] = '1'
+    if makeolder:
+        query['makeolder'] = '1'
+    if resign:
+        query['resign'] = '1'
+    if comment:
+        query['comment'] = comment
+    u = makeurl(src_apiurl, ['source', dst_project], query=query)
+    print("copyprj ", u, file=sys.stderr)
+    f = http_POST(u)
+    return f.read()
 
 def lock(apiurl: str, project: str, package: str, msg: str = None):
     url_path = ["source", project]