From 4e58904e2d2bffb3a95aa3050257c3225ff4741b Mon Sep 17 00:00:00 2001 From: VALLONGOL Date: Mon, 25 Aug 2025 08:25:53 +0200 Subject: [PATCH] Chore: Stop tracking files based on .gitignore update. Untracked files matching the following rules: - Rule "!.vscode/launch.json": 1 file --- .gitignore | 2 ++ PyHasher.ico | Bin 0 -> 9729 bytes pyhasher/_version.py | 74 +++++++++++++++++++++++++++++++++++++++++++ pyhasher/gui/gui.py | 25 ++++++++++++++- 4 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 pyhasher/_version.py diff --git a/.gitignore b/.gitignore index 66fc7dc..020285c 100644 --- a/.gitignore +++ b/.gitignore @@ -148,3 +148,5 @@ dmypy.json # Temporary files *.swp *~ +_dist/* +_build/* diff --git a/PyHasher.ico b/PyHasher.ico index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..06a9ac1b1daf9443255e8e3e9ec424bc7ffdbfa8 100644 GIT binary patch literal 9729 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 literal 0 HcmV?d00001 diff --git a/pyhasher/_version.py b/pyhasher/_version.py new file mode 100644 index 0000000..73d0a40 --- /dev/null +++ b/pyhasher/_version.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +# File generated by PyInstaller GUI Wrapper. DO NOT EDIT MANUALLY. +# Contains build-time information scraped from Git (if available) +# and a helper function to format version strings. + +import re + +# --- Version Data (Generated) --- +__version__ = "v.0.0.0.1-0-gf0149af-dirty" +GIT_COMMIT_HASH = "f0149af3b3d61c9959a5c14fbd2b8105ef333364" +GIT_BRANCH = "master" +BUILD_TIMESTAMP = "2025-08-25T06:19:22.500895+00:00" +IS_GIT_REPO = True + +# --- Default Values (for comparison or fallback) --- +DEFAULT_VERSION = "0.0.0+unknown" +DEFAULT_COMMIT = "Unknown" +DEFAULT_BRANCH = "Unknown" + +# --- Helper Function --- +def get_version_string(format_string=None): + """ + Returns a formatted string based on the build version information. + + Args: + format_string (str, optional): A format string using placeholders. + Defaults to "{version} ({branch}/{commit_short})" if None. + Placeholders: + {{version}}: Full version string (e.g., 'v1.0.0-5-gabcdef-dirty') + {{tag}}: Clean tag part if exists (e.g., 'v1.0.0'), else DEFAULT_VERSION. + {{commit}}: Full Git commit hash. + {{commit_short}}: Short Git commit hash (7 chars). + {{branch}}: Git branch name. + {{dirty}}: '-dirty' if the repo was dirty, empty otherwise. + {{timestamp}}: Full build timestamp (ISO 8601 UTC). + {{timestamp_short}}: Build date only (YYYY-MM-DD). + {{is_git}}: 'Git' if IS_GIT_REPO is True, 'Unknown' otherwise. + + Returns: + str: The formatted version string, or an error message if formatting fails. + """ + if format_string is None: + format_string = "{version} ({branch}/{commit_short})" # Default format + + replacements = {} + try: + replacements['version'] = __version__ if __version__ else DEFAULT_VERSION + replacements['commit'] = GIT_COMMIT_HASH if GIT_COMMIT_HASH else DEFAULT_COMMIT + replacements['commit_short'] = GIT_COMMIT_HASH[:7] if GIT_COMMIT_HASH and len(GIT_COMMIT_HASH) >= 7 else DEFAULT_COMMIT + replacements['branch'] = GIT_BRANCH if GIT_BRANCH else DEFAULT_BRANCH + replacements['timestamp'] = BUILD_TIMESTAMP if BUILD_TIMESTAMP else "Unknown" + replacements['timestamp_short'] = BUILD_TIMESTAMP.split('T')[0] if BUILD_TIMESTAMP and 'T' in BUILD_TIMESTAMP else "Unknown" + replacements['is_git'] = "Git" if IS_GIT_REPO else "Unknown" + replacements['dirty'] = "-dirty" if __version__ and __version__.endswith('-dirty') else "" + + tag = DEFAULT_VERSION + if __version__ and IS_GIT_REPO: + match = re.match(r'^(v?([0-9]+(?:\.[0-9]+)*))', __version__) + if match: + tag = match.group(1) + replacements['tag'] = tag + + output_string = format_string + for placeholder, value in replacements.items(): + pattern = re.compile(r'{{\s*' + re.escape(placeholder) + r'\s*}}') + output_string = pattern.sub(str(value), output_string) + + if re.search(r'{\s*\w+\s*}', output_string): + pass # Or log a warning: print(f"Warning: Unreplaced placeholders found: {output_string}") + + return output_string + + except Exception as e: + return f"[Formatting Error: {e}]" diff --git a/pyhasher/gui/gui.py b/pyhasher/gui/gui.py index a61e303..fb14937 100644 --- a/pyhasher/gui/gui.py +++ b/pyhasher/gui/gui.py @@ -21,6 +21,26 @@ HASH_DISPLAY_ORDER = ( "BLAKE2b", ) +# --- Import Version Info FOR THE WRAPPER ITSELF --- +try: + # Use absolute import based on package name + from pyhasher import _version as wrapper_version + + WRAPPER_APP_VERSION_STRING = f"{wrapper_version.__version__} ({wrapper_version.GIT_BRANCH}/{wrapper_version.GIT_COMMIT_HASH[:7]})" + WRAPPER_BUILD_INFO = f"Wrapper Built: {wrapper_version.BUILD_TIMESTAMP}" +except ImportError: + # This might happen if you run the wrapper directly from source + # without generating its _version.py first (if you use that approach for the wrapper itself) + WRAPPER_APP_VERSION_STRING = "(Dev Wrapper)" + WRAPPER_BUILD_INFO = "Wrapper build time unknown" +# --- End Import Version Info --- + +# --- Constants for Version Generation --- +DEFAULT_VERSION = "0.0.0+unknown" +DEFAULT_COMMIT = "Unknown" +DEFAULT_BRANCH = "Unknown" +# --- End Constants --- + class PyHasherApp: """ The main GUI application class for PyHasher. @@ -34,7 +54,10 @@ class PyHasherApp: root_window: The main tkinter window. """ self.root = root_window - self.root.title("PyHasher") + self.root.title( + f"PyHasher - {WRAPPER_APP_VERSION_STRING}" + ) + self.root.geometry("1024x400") # Increased height for more hashes self.file_path = tk.StringVar()