diff --git a/osc/commandline.py b/osc/commandline.py index 987e25e914..344ea98191 100644 --- a/osc/commandline.py +++ b/osc/commandline.py @@ -7390,7 +7390,10 @@ def do_build(self, subcmd, opts, *args): if not opts.local_package: store = osc_store.get_store(Path.cwd(), print_warnings=True) - store.assert_is_package() + if isinstance(store, git_scm.store.GitStore): + opts.local_package = True + else: + store.assert_is_package() try: if opts.alternative_project and opts.alternative_project == store.project: @@ -7404,6 +7407,7 @@ def do_build(self, subcmd, opts, *args): except oscerr.NoWorkingCopy: store = None + # HACK: avoid calling some underlying store_*() functions from parse_repoarchdescr() method # We'll fix parse_repoarchdescr() later because it requires a larger change if not opts.alternative_project and isinstance(store, git_scm.GitStore): diff --git a/osc/git_scm/store.py b/osc/git_scm/store.py index e72ef0dff5..ba03af6e17 100644 --- a/osc/git_scm/store.py +++ b/osc/git_scm/store.py @@ -31,8 +31,15 @@ def __init__(self, path, check=True): self.abspath = os.path.abspath(self.path) # TODO: how to determine if the current git repo contains a project or a package? - self.is_project = False - self.is_package = os.path.exists(os.path.join(self.abspath, ".git")) + + # NOTE: we have only one store in project-git for all packages + self._toplevel = self._run_git(["rev-parse", "--show-toplevel"]) + if self._toplevel == self.abspath: + self.is_project = True + self.is_package = False + else: + self.is_project = False + self.is_package = True self._package = None self._project = None @@ -68,11 +75,17 @@ def apiurl(self): @property def project(self): + if self._project is None: + if self._toplevel: + with open(os.path.join(self._toplevel, '.osc/_project')) as f: + self._project = f.readline().strip() + if self._project is None: # get project from the branch name branch = self._run_git(["branch", "--show-current"]) # HACK: replace hard-coded mapping with metadata from git or the build service + # NOTE: you never know which git repo is supposed to be used in which project if branch == "factory": self._project = "openSUSE:Factory" else: diff --git a/osc/store.py b/osc/store.py index cf4d8bc352..a315a15a14 100644 --- a/osc/store.py +++ b/osc/store.py @@ -6,6 +6,7 @@ import os +import subprocess from xml.etree import ElementTree as ET from . import oscerr @@ -29,6 +30,17 @@ def get_store(path, check=True, print_warnings=False): git_scm.warn_experimental() else: store = None + try: + toplevel = subprocess.check_output(["git", "rev-parse", "--show-toplevel"], + encoding="utf-8", + stderr=subprocess.DEVNULL).strip() + if toplevel: + store = git_scm.GitStore(toplevel, check) + if print_warnings: + git_scm.warn_experimental() + except: + # we nay should distinguish between git cli fails or git is not installed + pass if not store: msg = f"Directory '{path}' is not a working copy"