Skip to content

Commit 1196e17

Browse files
authored
Merge pull request openSUSE#1635 from adrianschroeter/fix_scmsync_revisioned_checkout
Fix scmsync revisioned checkout
2 parents 1d87e29 + 5172002 commit 1196e17

File tree

2 files changed

+65
-0
lines changed

2 files changed

+65
-0
lines changed

osc/core.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3156,8 +3156,17 @@ def checkout_package(
31563156
raise oscerr.OscIOError(None, 'Install the obs-scm-bridge package to work on packages managed in scm (git)!')
31573157
scm_url = scmsync_element.text
31583158
directory = make_dir(apiurl, project, package, pathname, prj_dir, conf.config['do_package_tracking'], outdir)
3159+
3160+
if revision is not None:
3161+
# search for the git sha sum based on the OBS DISTURL package source revision
3162+
# we need also take into account that the url was different at that point of time
3163+
from .obs_api.scmsync_obsinfo import ScmsyncObsinfo
3164+
scmsync_obsinfo = ScmsyncObsinfo.from_api(apiurl, project, package, rev=revision)
3165+
scm_url = f"{scmsync_obsinfo.url}#{scmsync_obsinfo.revision}"
3166+
31593167
os.putenv("OSC_VERSION", get_osc_version())
31603168
run_external(['/usr/lib/obs/service/obs_scm_bridge', '--outdir', directory, '--url', scm_url])
3169+
31613170
Package.init_package(apiurl, project, package, directory, size_limit, meta, progress_obj, scm_url)
31623171

31633172
# add package to <prj>/.obs/_packages

osc/obs_api/scmsync_obsinfo.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import typing
2+
3+
from ..util.models import * # pylint: disable=wildcard-import,unused-wildcard-import
4+
5+
6+
class ScmsyncObsinfo(BaseModel):
7+
"""
8+
Class for handling _scmsync.obsinfo files
9+
"""
10+
11+
mtime: int = Field()
12+
commit: str = Field()
13+
url: str = Field()
14+
revision: str = Field()
15+
16+
@classmethod
17+
def from_string(cls, data: str) -> "ScmsyncObsinfo":
18+
kwargs = {}
19+
for line in data.splitlines():
20+
line = line.strip()
21+
if not line:
22+
continue
23+
key, value = line.split(": ", 1)
24+
field = cls.__fields__.get(key, None)
25+
if field and field.type is int:
26+
value = int(value)
27+
kwargs[key] = value
28+
return cls(**kwargs)
29+
30+
@classmethod
31+
def from_file(cls, file: Union[str, typing.IO]) -> "ScmsyncObsinfo":
32+
if isinstance(file, str):
33+
with open(file, "r", encoding="utf-8") as f:
34+
return cls.from_string(f.read())
35+
data = file.read()
36+
if isinstance(data, bytes):
37+
data = data.decode("utf-8")
38+
return cls.from_string(data)
39+
40+
@classmethod
41+
def from_api(cls, apiurl: str, project: str, package: str, *, rev: str) -> "ScmsyncObsinfo":
42+
import urllib.error
43+
from .. import oscerr
44+
from ..connection import http_request
45+
from ..core import makeurl
46+
47+
url_path = ["source", project, package, "_scmsync.obsinfo"]
48+
url_query = {"rev": rev}
49+
url = makeurl(apiurl, url_path, url_query)
50+
try:
51+
response = http_request("GET", url)
52+
except urllib.error.HTTPError as e:
53+
if e.status == 404:
54+
raise oscerr.NotFoundAPIError(f"File '_scmsync.obsinfo' was not found in {project}/{package}, rev={rev}")
55+
raise
56+
return cls.from_file(response)

0 commit comments

Comments
 (0)