buildpackage & buildpackage_rpm: add new choices for '--git-export' option.
authorwanchao-xu <wanchao.xu@samsung.com>
Mon, 29 Apr 2024 06:19:39 +0000 (14:19 +0800)
committerwanchao-xu <wanchao.xu@samsung.com>
Mon, 29 Apr 2024 06:19:39 +0000 (14:19 +0800)
Add support for building different kind of "working copies", when using
the --git-export option:
- 'WC.TRACKED': only use files that are already tracked
- 'WC.UNTRACKED': use untracked files, too
- 'WC.IGNORED': also add files that'd normally be ignored

Using '--git-export=WC' beaves like before.

Change-Id: Iaabe7979a885cfe2f67a26c0b33a1d198f0554dc
Signed-off-by: wanchao-xu <wanchao.xu@samsung.com>
gbp/git/repository.py
gbp/scripts/buildpackage.py
gbp/scripts/buildpackage_rpm.py
gbp/scripts/common/buildpackage.py

index a7810dcf94ce0a276dbe41a5ac982c94f88bdec6..cad3e4a5e8d0fbca424ce40112dab97d6ed700b5 100644 (file)
@@ -1379,7 +1379,8 @@ class GitRepository(object):
 
 #{ Files
 
-    def add_files(self, paths, force=False, index_file=None, work_tree=None):
+    def add_files(self, paths, force=False, untracked=True, index_file=None,
+                  work_tree=None):
         """
         Add files to a the repository
 
@@ -1395,7 +1396,10 @@ class GitRepository(object):
         if isinstance(paths, str):
             paths = [paths]
 
-        args = ['-f'] if force else []
+        args = GitArgs()
+        args.add_true(force, '-f')
+        args.add_cond(untracked, '-A', '-u')
+        args.add(paths)
 
         if index_file:
             extra_env['GIT_INDEX_FILE'] = index_file
@@ -1403,7 +1407,7 @@ class GitRepository(object):
         if work_tree:
             extra_env['GIT_WORK_TREE'] = work_tree
 
-        self._git_command("add", args + paths, extra_env)
+        self._git_command("add", args.args, extra_env)
 
     def remove_files(self, paths, verbose=False):
         """
index f86771812043c9b1d3206898ec431ee17135fe38..967f1e476cccd871db923e7cb839e6e4cf6d391b 100755 (executable)
@@ -37,7 +37,7 @@ from gbp.deb.upstreamsource import DebianUpstreamSource, DebianAdditionalTarball
 from gbp.errors import GbpError
 import gbp.log
 import gbp.notifications
-from gbp.scripts.common.buildpackage import (index_name, wc_name,
+from gbp.scripts.common.buildpackage import (index_name, wc_names,
                                              dump_tree,
                                              write_wc, drop_index)
 from gbp.scripts.common import ExitCodes
@@ -61,8 +61,10 @@ def maybe_write_tree(repo, options):
     if options.export_dir:
         if options.export == index_name:
             tree = repo.write_tree()
-        elif options.export == wc_name:
-            tree = write_wc(repo)
+        elif options.export in wc_names:
+            tree = write_wc(repo,
+                            force=wc_names[options.export]['force'],
+                            untracked=wc_names[options.export]['untracked'])
         else:
             tree = options.export
         if not repo.has_treeish(tree):
@@ -274,7 +276,7 @@ def mangle_export_wc_opts(options):
     """
     Make building with --export=WC simpler
     """
-    if options.export == wc_name:
+    if options.export in wc_names:
         options.ignore_branch = True
         options.ignore_new = True
 
index 03ddc97f8f98123cc5187b4d0f0d19068b6e6ad2..0c417fc5308f67a7974bbbd5c216b4aa395a214e 100644 (file)
@@ -35,7 +35,7 @@ from gbp.rpm.git import GitRepositoryError, RpmGitRepository
 from gbp.rpm.policy import RpmPkgPolicy
 from gbp.tmpfile import init_tmpdir, del_tmpdir, tempfile
 from gbp.scripts.common import ExitCodes
-from gbp.scripts.common.buildpackage import (index_name, wc_name,
+from gbp.scripts.common.buildpackage import (index_name, wc_names,
                                              dump_tree, write_wc, drop_index)
 from gbp.scripts.pq_rpm import update_patch_series, parse_spec
 from gbp.scripts.common.pq import is_pq_branch, pq_branch_name, pq_branch_base
@@ -154,9 +154,11 @@ def get_tree(repo, tree_name):
         if tree_name == index_name:
             # Write a tree of the index
             tree = repo.write_tree()
-        elif tree_name == wc_name:
+        elif tree_name in wc_names:
             # Write a tree of the working copy
-            tree = write_wc(repo)
+            tree = write_wc(repo,
+                            force=wc_names[tree_name]['force'],
+                            untracked=wc_names[tree_name]['untracked'])
         else:
             tree = tree_name
     except GitRepositoryError as err:
@@ -197,7 +199,7 @@ def guess_export_params(repo, options):
     """Get commit and tree from where to export packaging and patches"""
     tree = None
     branch = None
-    if options.export in [wc_name, index_name, 'HEAD']:
+    if options.export in wc_names.keys() + [index_name, 'HEAD']:
         branch = get_current_branch(repo)
     elif options.export in repo.get_local_branches():
         branch = options.export
index 7071cdc1aa6ce768d3edb38d3cc901efbf2eb537..761fdca47aade24e5e19c1006711d604f068e3f1 100644 (file)
@@ -21,6 +21,7 @@
 import os
 import os.path
 import pipes
+import shutil
 from gbp.git import GitRepositoryError
 from gbp.pkg.git import PkgGitRepository
 from gbp.errors import GbpError
@@ -29,7 +30,10 @@ import gbp.log
 # when we want to reference the index in a treeish context we call it:
 index_name = "INDEX"
 # when we want to reference the working copy in treeish context we call it:
-wc_name = "WC"
+wc_names = {'WC': {'force': True, 'untracked': True},
+            'WC.TRACKED': {'force': False, 'untracked': False},
+            'WC.UNTRACKED': {'force': False, 'untracked': True},
+            'WC.IGNORED': {'force': True, 'untracked': True}}
 
 
 #  Functions to handle export-dir
@@ -87,11 +91,11 @@ def wc_index(repo):
     return os.path.join(repo.git_dir, "gbp_index")
 
 
-def write_wc(repo, force=True):
+def write_wc(repo, force=True, untracked=True):
     """write out the current working copy as a treeish object"""
-    index_file = wc_index(repo)
-    repo.add_files(repo.path, force=force, index_file=index_file)
-    tree = repo.write_tree(index_file=index_file)
+    clone_index(repo)
+    repo.add_files(repo.path, force=force, untracked=untracked, index_file=wc_index(repo))
+    tree = repo.write_tree(index_file=wc_index(repo))
     return tree
 
 
@@ -100,3 +104,10 @@ def drop_index(repo):
     index_file = wc_index(repo)
     if os.path.exists(index_file):
         os.unlink(index_file)
+
+
+def clone_index(repo):
+    """Copy the current index file to our custom index file"""
+    indexfn = os.path.join(repo.git_dir, "index")
+    if os.path.exists(indexfn):
+        shutil.copy2(indexfn, wc_index(repo))