tis-git icon

Git

Paquet d'installation silencieuse pour Git

2.56.0-18
Development
Utilities
Development
Utilities

  • package: tis-git
  • name: Git
  • version: 2.56.0-18
  • categories: Development,Utilities
  • maintainer: WAPT Team,Tranquil IT,Jimmy PELÉ,Flavien SCHELFAUT
  • editor: Software Freedom Conservancy
  • licence: opensource_free,cpe:/a:gnu:gpl_v2,wapt_public
  • locale: all
  • target_os: darwin
  • impacted_process: git
  • architecture: all
  • signature_date:
  • size: 29.01 Mo
  • homepage : https://git-scm.com/

package           : tis-git
version           : 2.56.0-18
architecture      : all
section           : base
priority          : optional
name              : Git
categories        : Development,Utilities
maintainer        : WAPT Team,Tranquil IT,Jimmy PELÉ,Flavien SCHELFAUT
description       : Git is a free, open-source, decentralized version control system designed to quickly and efficiently manage all projects, from the smallest to the largest
depends           : 
conflicts         : 
maturity          : PROD
locale            : all
target_os         : darwin
min_wapt_version  : 2.3
sources           : https://mirrors.edge.kernel.org/pub/software/scm/git/
installed_size    : 
impacted_process  : git
description_fr    : Git est un système de contrôle de version libre, gratuit et décentralisé, conçu pour gérer rapidement et efficacement tous les projets, des plus petits aux plus grands
description_pl    : Git to darmowy, zdecentralizowany system kontroli wersji o otwartym kodzie źródłowym, zaprojektowany do szybkiego i wydajnego zarządzania wszystkimi projektami, od najmniejszych do największych
description_de    : Git ist ein kostenloses, dezentralisiertes Open-Source-Versionskontrollsystem, das für die schnelle und effiziente Verwaltung aller Projekte, von den kleinsten bis zu den größten, entwickelt wurde
description_es    : Git es un sistema de control de versiones descentralizado, gratuito y de código abierto diseñado para gestionar de forma rápida y eficaz todos los proyectos, desde los más pequeños a los más grandes
description_pt    : O Git é um sistema de controlo de versões gratuito, de código aberto e descentralizado, concebido para gerir rápida e eficientemente todos os projectos, desde os mais pequenos aos maiores
description_it    : Git è un sistema di controllo delle versioni gratuito, open-source e decentralizzato, progettato per gestire in modo rapido ed efficiente tutti i progetti, dai più piccoli ai più grandi
description_nl    : Git is een gratis, open-source, gedecentraliseerd versiebeheersysteem dat is ontworpen om snel en efficiënt alle projecten te beheren, van de kleinste tot de grootste
description_ru    : Git - это бесплатная децентрализованная система контроля версий с открытым исходным кодом, предназначенная для быстрого и эффективного управления всеми проектами, от самых маленьких до самых больших
audit_schedule    : 
editor            : Software Freedom Conservancy
keywords          : git,project,projects,version,control,system
licence           : opensource_free,cpe:/a:gnu:gpl_v2,wapt_public
homepage          : https://git-scm.com/
package_uuid      : 7c0de4fa-0d89-44ba-88b9-6457eefbdf9f
valid_from        : 
valid_until       : 
forced_install_on : 
changelog         : https://github.com/git/git/blob/master/Documentation/RelNotes
min_os_version    : 11
max_os_version    : 
icon_sha256sum    : 4a6e5031edc6e22a06cb5f12e89dea8738b88839c2cb99e2e7e0d9df345e2252
signer            : Tranquil IT
signer_fingerprint: 8c5127a75392be9cc9afd0dbae1222a673072c308c14d88ab246e23832e8c6bb
signature_date    : 2026-10-13T10:23:04.000000
signed_attributes : package,version,architecture,section,priority,name,categories,maintainer,description,depends,conflicts,maturity,locale,target_os,min_wapt_version,sources,installed_size,impacted_process,description_fr,description_pl,description_de,description_es,description_pt,description_it,description_nl,description_ru,audit_schedule,editor,keywords,licence,homepage,package_uuid,valid_from,valid_until,forced_install_on,changelog,min_os_version,max_os_version,icon_sha256sum,signer,signer_fingerprint,signature_date,signed_attributes
signature         : dPWAP9/LBJz5ch5lfLMWNCSRR4UxxBkaYZYGJlOiGQwl8k1nalRmOi5OZ1m2gJ52CkjZZ1dkDNGqfQEPMSTfU1w/uuR1z1sCGNuHLIVZ4oPz+2lYhY6yXiooKyqRAW+MGJYppg7PgR/7hw+BjwYqQy3A7SuGIXl8VVvaWFdGpUPZv8Q1pPN8xQxRFM6iwHjRPtb4zzEgGB43Lln3XRtoZi5AqcvV7akS2y1pia8UzFPx47TyJKUnbQRgTvzSbNkJ1y6sf1iN8C1Wqm3rzy9AlTfEglD1zyKa8iXRUX+eKlWMRgivxEZwfMZNr81sBqVGPKca5/qiic6bWCyLrtDKwA==

# -*- coding: utf-8 -*-
from setuphelpers import *
import os
import tarfile

app_dir = "/usr/local/git"
manpaths_file = "/etc/manpaths.d/git"


def install():

    killalltasks(ensure_list(control.impacted_process))
    if isdir(app_dir):
        remove_tree(app_dir)
    with tarfile.open(glob.glob("git-*-macos-universal.tar.gz")[0]) as tar:
        tar.extractall("/usr/local")

    mkdirs("/usr/local/bin")
    for bin_path in glob.glob(makepath(app_dir, "bin", "*")):
        link_path = makepath("/usr/local/bin", os.path.basename(bin_path))
        if not os.path.lexists(link_path):
            os.symlink(bin_path, link_path)

    with open(manpaths_file, "w", encoding="utf-8") as f:
        f.write(f"{app_dir}/share/man\n")


def uninstall():
    killalltasks(ensure_list(control.impacted_process))
    for bin_path in glob.glob(makepath(app_dir, "bin", "*")):
        link_path = makepath("/usr/local/bin", os.path.basename(bin_path))
        if os.path.islink(link_path) and os.readlink(link_path) == bin_path:
            os.remove(link_path)
    if isfile(manpaths_file):
        remove_file(manpaths_file)
    if isdir(app_dir):
        remove_tree(app_dir)


def audit():
    app_path = makepath(app_dir, "bin", "git")
    if not isfile(app_path):
        print(f"{control.name} is not installed")
        return "ERROR"
    installed_version = run(f'"{app_path}" --version').split()[2]
    if Version(installed_version) < Version(control.get_software_version()):
        print(f"{control.name} is installed in version ({installed_version}) instead of ({control.get_software_version()})")
        return "WARNING"
    else:
        print(f"{control.name} ({installed_version}) is installed")
        return "OK"

# -*- coding: utf-8 -*-
from setuphelpers import *
from setupdevhelpers import *
import os
import tarfile
import tempfile

install_prefix = "/usr/local/git"
arch_list = ["arm64", "x86_64"]


def install_command_line_tools():
    """clang, make and the macOS SDK are needed to build git"""
    if isfile("/Library/Developer/CommandLineTools/usr/bin/clang"):
        return
    # This file makes softwareupdate list the Command Line Tools without prompting the user
    run("touch /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress")
    clt_label = [line.split("Label: ")[1] for line in run("softwareupdate --list").splitlines() if "Label: Command Line Tools" in line][-1]
    print(f"Installing: {clt_label}")
    run(f'softwareupdate --install "{clt_label}"', timeout=1200)
    remove_file("/tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress")


def extract_tar(tar_path, extract_path="."):
    with tarfile.open(tar_path, "r:*") as tar:
        tar.extractall(extract_path)


def build_git(version, source_bin, manpages_bin, latest_bin):
    build_root = tempfile.mkdtemp(prefix="tis-git-")
    src_dir = makepath(build_root, f"git-{version}")
    staging_dir = makepath(build_root, "staging")
    app_dir = staging_dir + install_prefix
    arch_flags = " ".join(f"-arch {arch}" for arch in arch_list) + f" -mmacosx-version-min={control.min_os_version}"
    make_dict = {
        "prefix": install_prefix,
        "CFLAGS": f"-O2 {arch_flags}",
        "LDFLAGS": arch_flags,
        # Only the macOS SDK libraries (libcurl, expat, iconv, CommonCrypto): nothing from Homebrew, MacPorts or Fink
        "NO_HOMEBREW": "YesPlease",
        "NO_DARWIN_PORTS": "YesPlease",
        "NO_FINK": "YesPlease",
        # Not in the macOS SDK: translations, Tcl/Tk (gitk, git gui), Python (git p4), Rust toolchain
        "NO_GETTEXT": "YesPlease",
        "NO_TCLTK": "YesPlease",
        "NO_PYTHON": "YesPlease",
        "NO_RUST": "YesPlease",
        "INSTALL_SYMLINKS": "YesPlease",
        "SKIP_DASHED_BUILT_INS": "YesPlease",
    }
    make_options = " ".join(f'{key}="{value}"' for key, value in make_dict.items())

    try:
        extract_tar(source_bin, build_root)
        print(f"Building: git {version}")
        run(f'make -C "{src_dir}" -j{os.cpu_count()} {make_options} all contrib/credential/osxkeychain/git-credential-osxkeychain', timeout=1800)
        run(f'make -C "{src_dir}" {make_options} DESTDIR="{staging_dir}" install install-git-credential-osxkeychain')

        mkdirs(makepath(app_dir, "share", "man"))
        extract_tar(manpages_bin, makepath(app_dir, "share", "man"))

        mkdirs(makepath(app_dir, "etc"))
        with open(makepath(app_dir, "etc", "gitconfig"), "w", encoding="utf-8") as f:
            f.write("[credential]\n\thelper = osxkeychain\n")

        # Fails if the binary does not contain both architectures
        run(f'lipo "{makepath(app_dir, "bin", "git")}" -verify_arch {" ".join(arch_list)}')

        with tarfile.open(latest_bin, "w:gz") as tar:
            tar.add(app_dir, arcname="git")
    finally:
        remove_tree(build_root)


def update_package():
    package_updated = False
    proxies = get_proxies()
    if not proxies:
        proxies = get_proxies_from_wapt_console()
    app_name = control.name

    base_url = "https://mirrors.edge.kernel.org/pub/software/scm/git"
    sha256sums_url = f"{base_url}/sha256sums.asc"
    print(f"URL used is: {sha256sums_url}")
    sha256sums = wgets(sha256sums_url, proxies=proxies)
    if isinstance(sha256sums, bytes):
        sha256sums = sha256sums.decode("utf-8")

    sha256_dict = {}
    for line in sha256sums.splitlines():
        parts = line.split()
        if len(parts) == 2 and len(parts[0]) == 64:
            sha256_dict[parts[1]] = parts[0]

    # Final releases only: "git-2.56.0.tar.xz", not "git-2.56.0.rc1.tar.xz" nor "git-manpages-2.56.0.tar.xz"
    source_versions = [name[len("git-"):-len(".tar.xz")] for name in sha256_dict if name.startswith("git-") and name.endswith(".tar.xz")]
    version = max((v for v in source_versions if all(part.isdigit() for part in v.split("."))), key=Version)
    print(f"Latest {app_name} version is: {version}")

    latest_bin = f"git-{version}-macos-universal.tar.gz"
    if not isfile(latest_bin):
        install_command_line_tools()

        download_dir = tempfile.mkdtemp(prefix="tis-git-src-")
        try:
            downloaded_bins = []
            for source_name in [f"git-{version}.tar.xz", f"git-manpages-{version}.tar.xz"]:
                download_url = f"{base_url}/{source_name}"
                print(f"Download URL is: {download_url}")
                downloaded_bins.append(makepath(download_dir, source_name))
                wget(download_url, downloaded_bins[-1], sha256=sha256_dict[source_name], proxies=proxies)
            build_git(version, downloaded_bins[0], downloaded_bins[1], makepath(os.getcwd(), latest_bin))
        finally:
            remove_tree(download_dir)
    else:
        print(f"Binary is present: {latest_bin}")

    for f in glob.glob("git-*-macos-universal.tar.gz"):
        if f != latest_bin:
            remove_file(f)

    if Version(version) > Version(control.get_software_version()):
        print(f"Software version updated (from: {control.get_software_version()} to: {Version(version)})")
        package_updated = True
    else:
        print(f"Software version up-to-date ({Version(version)})")

    control.set_software_version(version)
    control.save_control_to_wapt()

    return package_updated

38d056ab130f7bf7c481c12636a4e9959de36561d3dfcbe54c6e3571bc0c1dc3 : WAPT/certificate.crt
171dbf016eec5b602476d75411af469c3152bc381994ce9b9f4a1f64e952a5c7 : WAPT/control
4a6e5031edc6e22a06cb5f12e89dea8738b88839c2cb99e2e7e0d9df345e2252 : WAPT/icon.png
ac28e2b6617bf19f40062d5ee55378b08c22980b86b29d8840e45caefd917d4e : git-2.56.0-macos-universal.tar.gz
8fcd44f4ef8592173915e12844eb3b5de8834cb1a507ea293d68d98dfb55a5f5 : luti.json
8caad6606eef779d148146b8d3c34bef6e89fa07cfa62f3dc556417e6f0da7b8 : setup.py
4936a64d7b374b97f765670cf77455a11885f77eaff0f8d5e2c5fc408c4ac7c2 : update_package.py