gitow 1.0.0

Open Git remotes and repository pages in your browser from the CLI
Documentation
mod support;

use support::{binary, create_sandbox, git};

#[test]
fn applies_gitlab_domain_and_protocol_overrides() {
    let sandbox = create_sandbox();
    git(
        &[
            "remote",
            "set-url",
            "origin",
            "ssh://git@git.example.com:7000/XXX/YYY.git",
        ],
        sandbox.path(),
    );
    git(
        &[
            "config",
            "open.https://git.example.com.domain",
            "repo.intranet/subpath",
        ],
        sandbox.path(),
    );
    git(
        &["config", "open.https://git.example.com.protocol", "http"],
        sandbox.path(),
    );

    binary()
        .arg("--print")
        .current_dir(sandbox.path())
        .assert()
        .success()
        .stdout("http://repo.intranet/subpath/XXX/YYY\n");
}

#[test]
fn opens_merge_requests_commits_and_releases_for_gitlab() {
    let sandbox = create_sandbox();
    git(
        &[
            "remote",
            "set-url",
            "origin",
            "git@gitlab.example.com:user/repo.git",
        ],
        sandbox.path(),
    );
    git(&["checkout", "-B", "main"], sandbox.path());

    binary()
        .args(["--print", "--pull-requests"])
        .current_dir(sandbox.path())
        .assert()
        .success()
        .stdout("https://gitlab.example.com/user/repo/-/merge_requests\n");

    binary()
        .args(["--print", "--commits"])
        .current_dir(sandbox.path())
        .assert()
        .success()
        .stdout("https://gitlab.example.com/user/repo/-/commits/main\n");

    binary()
        .args(["--print", "--releases"])
        .current_dir(sandbox.path())
        .assert()
        .success()
        .stdout("https://gitlab.example.com/user/repo/-/releases\n");
}

#[test]
fn supports_gitea_branch_layout() {
    let sandbox = create_sandbox();
    git(
        &[
            "remote",
            "set-url",
            "origin",
            "ssh://git@gitea.internal/team/repo.git",
        ],
        sandbox.path(),
    );
    git(
        &["config", "open.https://gitea.internal.forge", "gitea"],
        sandbox.path(),
    );
    git(&["checkout", "-B", "feature/awesome"], sandbox.path());

    binary()
        .arg("--print")
        .current_dir(sandbox.path())
        .assert()
        .success()
        .stdout("https://gitea.internal/team/repo/src/branch/feature/awesome\n");
}

#[test]
fn auto_detects_codeberg_as_forgejo_gitea_family() {
    let sandbox = create_sandbox();
    git(
        &[
            "remote",
            "set-url",
            "origin",
            "https://codeberg.org/WhoSowSee/Soundly.git",
        ],
        sandbox.path(),
    );
    git(&["checkout", "-B", "main"], sandbox.path());

    binary()
        .arg("--print")
        .current_dir(sandbox.path())
        .assert()
        .success()
        .stdout("https://codeberg.org/WhoSowSee/Soundly/src/branch/main\n");
}

#[test]
fn opens_pull_requests_commits_and_releases_for_codeberg() {
    let sandbox = create_sandbox();
    git(
        &[
            "remote",
            "set-url",
            "origin",
            "https://codeberg.org/WhoSowSee/Soundly.git",
        ],
        sandbox.path(),
    );
    git(&["checkout", "-B", "main"], sandbox.path());

    binary()
        .args(["--print", "--pull-requests"])
        .current_dir(sandbox.path())
        .assert()
        .success()
        .stdout("https://codeberg.org/WhoSowSee/Soundly/pulls\n");

    binary()
        .args(["--print", "--commits"])
        .current_dir(sandbox.path())
        .assert()
        .success()
        .stdout("https://codeberg.org/WhoSowSee/Soundly/commits/branch/main\n");

    binary()
        .args(["--print", "--releases"])
        .current_dir(sandbox.path())
        .assert()
        .success()
        .stdout("https://codeberg.org/WhoSowSee/Soundly/releases\n");
}