Consistent version/branch info, fix gitorigin

- Dev dist: mntm-(branch)-(commit)
- Dev version: mntm-dev
- Dev gitbranch: (branch)
- Tag dist: mntm-(ver)
- Tag version: mntm-(ver)
- Tag gitbranch: mntm-(ver)
- Consistent between CI and local
- Gitorigin falls back based on context
- MNTM settings header won't clip with custom branch names
- About fw info page shows dirty flag and branch when custom, in same layout as OFW
This commit is contained in:
Willy-JL
2024-06-01 08:31:53 +01:00
parent 4be9768e10
commit cb2714ebe5
6 changed files with 65 additions and 38 deletions
@@ -351,13 +351,15 @@ MomentumApp* momentum_app_alloc() {
app->dolphin_angry = stats.butthurt;
furi_record_close(RECORD_DOLPHIN);
// Will be "(version) (commit or date)"
app->version_tag = furi_string_alloc_set(version_get_version(NULL));
size_t separator = furi_string_search_char(app->version_tag, '-', strlen("mntm-"));
Canvas* canvas = gui_direct_draw_acquire(app->gui); // Need canvas to calculate text length
size_t separator = furi_string_size(app->version_tag);
// Need canvas to calculate text length
Canvas* canvas = gui_direct_draw_acquire(app->gui);
canvas_set_font(canvas, FontPrimary);
if(separator != FURI_STRING_FAILURE) {
// Change second - to space
furi_string_set_char(app->version_tag, separator, ' ');
if(furi_string_equal(app->version_tag, "mntm-dev")) {
// Add space, add commit sha
furi_string_cat_printf(app->version_tag, " %s", version_get_githash(NULL));
// Make uppercase
for(size_t i = 0; i < furi_string_size(app->version_tag); ++i) {
furi_string_set_char(
@@ -369,7 +371,6 @@ MomentumApp* momentum_app_alloc() {
furi_string_left(app->version_tag, furi_string_size(app->version_tag) - 1);
}
} else {
separator = furi_string_size(app->version_tag);
// Make uppercase, add space, add build date
furi_string_replace(app->version_tag, "mntm", "MNTM");
furi_string_cat_printf(app->version_tag, " %s", version_get_builddate(NULL));
+12 -9
View File
@@ -171,21 +171,24 @@ static DialogMessageButton about_screen_fw_version(DialogsApp* dialogs, DialogMe
} else {
uint16_t api_major, api_minor;
furi_hal_info_get_api_version(&api_major, &api_minor);
furi_string_set(buffer, version_get_version(ver));
size_t sha_pos = furi_string_search_char(buffer, '-', strlen("mntm-"));
if(sha_pos != FURI_STRING_FAILURE) {
// Strip commit sha if present (non-release)
furi_string_left(buffer, sha_pos);
}
furi_string_cat_printf(
buffer,
" %s\n%s F%d:%d.%d %s\nmomentum-fw.dev",
"%s [%s]\n%s%s [%d.%d] %s\n[%d] ",
version_get_version(ver),
version_get_builddate(ver),
version_get_dirty_flag(ver) ? "[!] " : "",
version_get_githash(ver),
version_get_target(ver),
api_major,
api_minor,
c2_ver ? c2_ver->StackTypeString : "<none>");
c2_ver ? c2_ver->StackTypeString : "<none>",
version_get_target(ver));
if(!strcmp(version_get_version(ver), "mntm-dev") &&
strcmp(version_get_gitbranch(ver), "dev")) {
// Not a tag but not dev branch, show custom branch
furi_string_cat(buffer, version_get_gitbranch(ver));
} else {
furi_string_cat(buffer, "momentum-fw.dev");
}
}
dialog_message_set_header(message, "Firmware Info:", 0, 0, AlignLeft, AlignTop);
+10 -6
View File
@@ -31,13 +31,17 @@ if not os.environ.get("DIST_SUFFIX"):
)
try:
local_branch = git("symbolic-ref", "HEAD", "--short")
ref = git("config", "--get", f"branch.{local_branch}.merge")
# For tags, dist name is just the tag name: mntm-(ver)
DIST_SUFFIX = git("describe", "--tags", "--abbrev=0", "--exact-match")
except Exception:
ref = "refs/heads/detached"
branch_name = re.sub("refs/\w+/", "", ref)
commit_sha = git("rev-parse", "HEAD")[:8]
DIST_SUFFIX = "mntm-" + branch_name.replace("/", "_") + "-" + commit_sha
# If not a tag, dist name is: mntm-(branch)-(commmit)
branch_name = git("rev-parse", "--abbrev-ref", "HEAD").removeprefix("mntm-")
commit_sha = git("rev-parse", "HEAD")[:8]
DIST_SUFFIX = f"mntm-{branch_name}-{commit_sha}"
# Dist name is only for naming of output files
DIST_SUFFIX = DIST_SUFFIX.replace("/", "-")
# Instead, FW version uses tag name (mntm-xxx), or "mntm-dev" if not a tag (see scripts/version.py)
# You can get commit and branch info in firmware with appropriate version_get_*() calls
# Skip external apps by default
SKIP_EXTERNAL = False
-2
View File
@@ -32,8 +32,6 @@ def generate(env):
"${TARGET.dir.posix}",
"--dir",
"${ROOT_DIR}",
"--suffix",
"${DIST_SUFFIX}",
]
],
"${VERSIONCOMSTR}",
+5 -2
View File
@@ -60,10 +60,13 @@ def get_details(event, args):
data["commit_sha"] = data["commit_hash"][:8]
data["branch_name"] = re.sub("refs/\w+/", "", ref)
data["suffix"] = (
"mntm-" + data["branch_name"].replace("/", "_") + "-" + data["commit_sha"]
"mntm-"
+ data["branch_name"].removeprefix("mntm-").replace("/", "-")
+ "-"
+ data["commit_sha"]
)
if ref.startswith("refs/tags/"):
data["suffix"] = data["branch_name"].replace("/", "_")
data["suffix"] = data["branch_name"].replace("/", "-")
return data
+31 -13
View File
@@ -1,4 +1,5 @@
#!/usb/bin/env python3
import json
import os
import subprocess
@@ -10,9 +11,8 @@ from flipper.app import App
class GitVersion:
REVISION_SUFFIX_LENGTH = 8
def __init__(self, source_dir, suffix):
def __init__(self, source_dir):
self.source_dir = source_dir
self.suffix = suffix
def get_version_info(self):
commit = (
@@ -22,20 +22,26 @@ class GitVersion:
dirty = False
try:
self._exec_git("diff --quiet")
self._exec_git("diff HEAD --quiet") # Check both staged and not
except subprocess.CalledProcessError as e:
if e.returncode == 1:
dirty = True
try:
tag = self._exec_git("describe --tags --abbrev=0 --exact-match")
except subprocess.CalledProcessError:
tag = ""
# If WORKFLOW_BRANCH_OR_TAG is set in environment, is has precedence
# (set by CI)
branch = (
os.environ.get("WORKFLOW_BRANCH_OR_TAG", None)
or self._exec_git("rev-parse --abbrev-ref HEAD")
or tag
or self._exec_git("rev-parse --abbrev-ref HEAD").removeprefix("mntm-")
or "unknown"
)
version = self.suffix or os.environ.get("DIST_SUFFIX", None) or "unknown"
version = tag or "mntm-dev"
if "SOURCE_DATE_EPOCH" in os.environ:
commit_date = datetime.utcfromtimestamp(
@@ -52,18 +58,33 @@ class GitVersion:
"GIT_BRANCH": branch,
"VERSION": version,
"BUILD_DIRTY": dirty and 1 or 0,
"GIT_ORIGIN": self._get_git_origin(),
"GIT_ORIGIN": ",".join(self._get_git_origins()),
"GIT_COMMIT_DATE": commit_date,
}
def _get_git_origin(self):
def _get_git_origins(self):
try:
branch = self._exec_git("branch --show-current")
remote = self._exec_git(f"config branch.{branch}.remote")
origin = self._exec_git(f"remote get-url {remote}")
return origin
return set([origin])
except subprocess.CalledProcessError:
return ""
try:
remotes = self._exec_git("remote -v")
except subprocess.CalledProcessError:
remotes = ""
origins = set()
for line in remotes.split("\n"):
if not line:
continue
_, destination = line.split("\t")
url, _ = destination.split(" ")
origins.add(url)
break
if len(origins) == 1:
return origins
else:
return set(["https://github.com/Next-Flip/Momentum-Firmware"])
def _exec_git(self, args):
cmd = ["git"]
@@ -100,13 +121,10 @@ class Main(App):
required=True,
)
self.parser_generate.add_argument("--dir", dest="sourcedir", required=True)
self.parser_generate.add_argument("--suffix", dest="suffix", required=True)
self.parser_generate.set_defaults(func=self.generate)
def generate(self):
current_info = GitVersion(
self.args.sourcedir, self.args.suffix
).get_version_info()
current_info = GitVersion(self.args.sourcedir).get_version_info()
build_date = (
date.today()