Add dpkg-source export for debian. 54/308454/1 sandbox/xuhy/gbs-dpkg-source
authorxuhy <huayong.xu@samsung.com>
Tue, 5 Mar 2024 03:32:13 +0000 (11:32 +0800)
committerxuhy <huayong.xu@samsung.com>
Tue, 26 Mar 2024 10:39:04 +0000 (18:39 +0800)
Change-Id: Iea0a76a078662a85da707fa02b0e991a2c552b4c
Signed-off-by: xuhy <huayong.xu@samsung.com>
debian/control
gitbuildsys/cmd_export.py
tools/gbs

index 926c71b9d7dd2921b92ac1dcd403c4ece1a5fb48..acde930072d72d8cd0d957068d8d8da248d91c1b 100755 (executable)
@@ -43,7 +43,10 @@ Architecture: all
 Depends: ${misc:Depends}, ${python3:Depends},
  gbs-api (= ${binary:Version}),
  pristine-tar (>= 1.35-tizen20161231),
- git-buildpackage-rpm
+ git-buildpackage-rpm,
+ git-buildpackage,
+ dpkg-dev,
+ dpkg-source-gitarchive
 Conflicts: gbs (<< 0.26.29)
 Replaces: gbs (<< 0.26.29)
 Description: GBS export API
index 37e9bd657c4b4ba5fc85845ea6d3015f70e92c9b..7ec9a9abce0b010c912a09cf2f0cefaccc2f909e 100644 (file)
@@ -32,6 +32,7 @@ from gitbuildsys.errors import GbsError, Usage
 from gitbuildsys.log import LOGGER as log
 
 from gbp.scripts.buildpackage_rpm import main as gbp_build
+from gbp.scripts.buildpackage import main as gbp_build_deb
 from gbp.rpm.git import GitRepositoryError, RpmGitRepository
 import gbp.rpm as rpm
 from gbp.errors import GbpError
@@ -251,6 +252,62 @@ def export_sources(repo, commit, export_dir, spec, args, create_tarball=True):
     except GitRepositoryError as excobj:
         raise GbsError("Repository error: %s" % excobj)
 
+def export_source_deb(args, commit, package_dir, out_dir):
+    """
+    Export packaging files using dpkg-source
+    """
+    # Make sure that package dir is a git repo.
+    orig_dir = os.getcwd()
+    os.chdir(package_dir)
+
+    tmpdir = configmgr.get('tmpdir', 'general')
+    tempd = utils.Temp(prefix=os.path.join(tmpdir, '.dpkgsource_tmp_'), directory=True)
+    tmp_dir = tempd.path
+
+    # If export source in current package, dpkg-source would crash.
+    # A tmp dir need be created to store exported files.
+    tmp_export_dir = configmgr.get('tmpdir', 'general')
+    tempd = utils.Temp(prefix=os.path.join(tmpdir, '.dpkgsource_export_'), directory=True)
+    tmp_export_dir = tempd.path
+
+    argv = ["argv[0] placeholder",
+            "--git-color-scheme=magenta:green:yellow:red",
+            "--git-ignore-branch",
+            "--git-no-hooks",
+            "--git-notify=off",
+            "--git-ignore-new",
+            "--git-tmp-dir=%s" % tmp_dir,
+            "--git-export-dir=%s" % tmp_export_dir,
+            "--git-purge"]
+
+    if args.debug:
+        argv.append("--git-verbose")
+
+    argv.append("--git-export=%s" % commit)
+
+    # git-buildpackage export original source firstly, 'cd ..' is required.
+    export_command = "cd ..; dpkg-source -I -i -b %s" % (package_dir)
+    log.debug("dpkg-source export package command: [ %s ]." % export_command)
+    argv.append("--git-builder=%s" % (export_command))
+
+    try:
+        ret = gbp_build_deb(argv)
+        if ret:
+            raise GbsError("Failed to export packaging files from git tree")
+    except GitRepositoryError as excobj:
+        raise GbsError("Repository error: %s" % excobj)
+    finally:
+        os.chdir(orig_dir)
+
+    exported_files = os.listdir(tmp_export_dir)
+    for file_name in exported_files:
+        # Original source code are also exported into a dir.
+        file_or_dir = os.path.join(tmp_export_dir, file_name)
+        if os.path.isfile(file_or_dir):
+            log.debug('source deb move file: %s' % (file_or_dir))
+            shutil.move(file_or_dir, os.path.join(out_dir, file_name))
+
+    log.info('source deb generated to dir: %s' % (out_dir))
 
 def main(args):
     """gbs export entry point."""
@@ -268,7 +325,6 @@ def main(args):
     utils.git_status_checker(repo, args)
     workdir = repo.path
 
-
     # Only guess spec filename here, parse later when we have the correct
     # spec file at hand
     if args.commit:
@@ -277,12 +333,10 @@ def main(args):
         commit = 'WC.UNTRACKED'
     else:
         commit = 'HEAD'
-    orphan_packaging = configmgr.get('packaging_branch', 'orphan-devel')
-    spec_commit_id = orphan_packaging if orphan_packaging else commit
+
     log.debug("check packaging_dir")
     packaging_dir = get_packaging_dir(args)
-    main_spec, rest_specs = utils.guess_spec(workdir, packaging_dir,
-                                             args.spec, spec_commit_id)
+
     log.debug("check outdir")
     if args.outdir:
         outdir = args.outdir
@@ -294,6 +348,17 @@ def main(args):
             raise GbsError('no write permission to outdir: %s' % outdir)
     else:
         mkdir_p(outdir)
+
+    if args.deb:
+        log.debug("export deb source, package dir: %s, out dir: %s." % (workdir, outdir))
+        export_source_deb(args, commit, workdir, outdir)
+        return 0
+
+    orphan_packaging = configmgr.get('packaging_branch', 'orphan-devel')
+    spec_commit_id = orphan_packaging if orphan_packaging else commit
+    main_spec, rest_specs = utils.guess_spec(workdir, packaging_dir,
+                                             args.spec, spec_commit_id)
+
     log.debug("check tmpdir")
     tmpdir = configmgr.get('tmpdir', 'general')
     tempd = utils.Temp(prefix=os.path.join(tmpdir, '.gbs_export_'),
index 5ef1f5fcd7da19654a15be8b21a9de8185732fff..f0ef0d5fb1615ce8107dec4d9c09168c9449fc95 100755 (executable)
--- a/tools/gbs
+++ b/tools/gbs
@@ -145,6 +145,8 @@ def export_parser(parser):
                         'rather than outdir/pkg-version-release')
     parser.add_argument('--with-submodules', action='store_true',
                         help='export source code also with submodule code togerther')
+    parser.add_argument('--deb', action='store_true',
+                        help='generate source for debian')
 
     parser.set_defaults(alias="ex")
     return parser