about summary refs log tree commit diff stats
path: root/src/miasm/__init__.py
diff options
context:
space:
mode:
authorTheofilos Augoustis <theofilos.augoustis@gmail.com>2025-10-14 09:09:29 +0000
committerTheofilos Augoustis <theofilos.augoustis@gmail.com>2025-10-14 09:09:29 +0000
commit579cf1d03fb932083e6317967d1613d5c2587fb6 (patch)
tree629f039935382a2a7391bce9253f6c9968159049 /src/miasm/__init__.py
parent51c15d3ea2e16d4fc5f0f01a3b9befc66b1f982e (diff)
downloadfocaccia-miasm-579cf1d03fb932083e6317967d1613d5c2587fb6.tar.gz
focaccia-miasm-579cf1d03fb932083e6317967d1613d5c2587fb6.zip
Convert to src-layout ta/nix
Diffstat (limited to 'src/miasm/__init__.py')
-rw-r--r--src/miasm/__init__.py83
1 files changed, 83 insertions, 0 deletions
diff --git a/src/miasm/__init__.py b/src/miasm/__init__.py
new file mode 100644
index 00000000..309a1ae7
--- /dev/null
+++ b/src/miasm/__init__.py
@@ -0,0 +1,83 @@
+"Reverse engineering framework in Python"
+
+# Version generation stolen from Scapy
+
+import os
+import re
+import subprocess
+
+_MIASM_PKG_DIR = os.path.dirname(__file__)
+
+def _version_from_git_describe():
+    """
+    Read the version from ``git describe``. It returns the latest tag with an
+    optional suffix if the current directory is not exactly on the tag.
+
+    Example::
+
+        $ git describe --always
+        v2.3.2-346-g164a52c075c8
+
+    The tag prefix (``v``) and the git commit sha1 (``-g164a52c075c8``) are
+    removed if present.
+
+    If the current directory is not exactly on the tag, a ``.devN`` suffix is
+    appended where N is the number of commits made after the last tag.
+
+    Example::
+
+        >>> _version_from_git_describe()
+        '2.3.2.dev346'
+    """
+    if not os.path.isdir(os.path.join(os.path.dirname(_MIASM_PKG_DIR), '.git')):  # noqa: E501
+        raise ValueError('not in miasm git repo')
+
+    process = subprocess.Popen(['git', 'describe', '--always', '--tags'],
+                               cwd=_MIASM_PKG_DIR,
+                               stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+
+    out, err = process.communicate()
+
+    if process.returncode == 0:
+        tag = out.decode().strip()
+        match = re.match(r'^v?(.+?)-(\d+)-g[a-f0-9]+$', tag)
+        if match:
+            # remove the 'v' prefix and add a '.devN' suffix
+            return '%s.dev%s' % (match.group(1), match.group(2))
+        else:
+            # just remove the 'v' prefix
+            return re.sub(r'^v', '', tag)
+    else:
+        raise subprocess.CalledProcessError(process.returncode, err)
+
+
+def _version():
+    version_file = os.path.join(_MIASM_PKG_DIR, 'VERSION')
+    try:
+        tag = _version_from_git_describe()
+        # successfully read the tag from git, write it in VERSION for
+        # installation and/or archive generation.
+        with open(version_file, 'w') as fdesc:
+            fdesc.write(tag)
+        return tag
+    except Exception:
+        # failed to read the tag from git, try to read it from a VERSION file
+        try:
+            with open(version_file, 'r') as fdsec:
+                tag = fdsec.read()
+            return tag
+        except Exception:
+            # Rely on git archive "export-subst" git attribute.
+            # See 'man gitattributes' for more details.
+            git_archive_id = '$Format:%h %d$'
+            sha1 = git_archive_id.strip().split()[0]
+            match = re.search(r'tag:(\S+)', git_archive_id)
+            if match:
+                return "git-archive.dev" + match.group(1)
+            elif sha1:
+                return "git-archive.dev" + sha1
+            else:
+                return 'unknown.version'
+
+
+VERSION = __version__ = _version()