AtlatestRepositorysigil-git
1
(import (sigil test)2
(sigil string)3
(sigil git))5
;; ============================================================6
;; forge-base-url7
;; ============================================================9
(test-group "forge-base-url"10
(test "github"11
(assert-equal "https://github.com/" (forge-base-url 'github)))13
(test "gitlab"14
(assert-equal "https://gitlab.com/" (forge-base-url 'gitlab)))16
(test "codeberg"17
(assert-equal "https://codeberg.org/" (forge-base-url 'codeberg)))19
(test "unknown returns #f"20
(assert-false (forge-base-url 'unknown))))22
;; ============================================================23
;; parse-git-url - forge shorthand24
;; ============================================================26
(test-group "parse-git-url - forge shorthand"27
(test "github:user/repo"28
(let ((parsed (parse-git-url "github:user/repo")))29
(assert-true (pair? parsed))30
(assert-equal 'github (git-url-forge parsed))31
(assert-equal "user" (git-url-user parsed))32
(assert-equal "repo" (git-url-repo parsed))33
(assert-false (git-url-subpath parsed))34
(assert-false (git-url-ref parsed))))36
(test "codeberg:user/repo/sub/path"37
(let ((parsed (parse-git-url "codeberg:user/repo/sub/path")))38
(assert-equal 'codeberg (git-url-forge parsed))39
(assert-equal "user" (git-url-user parsed))40
(assert-equal "repo" (git-url-repo parsed))41
(assert-equal "sub/path" (git-url-subpath parsed))))43
(test "github:user/repo#main"44
(let ((parsed (parse-git-url "github:user/repo#main")))45
(assert-equal "main" (git-url-ref parsed))46
(assert-false (git-url-subpath parsed))))48
(test "with subpath and ref"49
(let ((parsed (parse-git-url "gitlab:org/project/src/lib#v2.0")))50
(assert-equal 'gitlab (git-url-forge parsed))51
(assert-equal "org" (git-url-user parsed))52
(assert-equal "project" (git-url-repo parsed))53
(assert-equal "src/lib" (git-url-subpath parsed))54
(assert-equal "v2.0" (git-url-ref parsed))))56
(test "invalid - missing repo"57
(assert-false (parse-git-url "github:useronly"))))59
;; ============================================================60
;; parse-git-url - full URLs61
;; ============================================================63
(test-group "parse-git-url - full URLs"64
(test "https URL"65
(let ((parsed (parse-git-url "https://example.com/repo.git")))66
(assert-true (pair? parsed))67
(assert-equal 'url (git-url-forge parsed))68
(assert-false (git-url-ref parsed))))70
(test "https URL with ref"71
(let ((parsed (parse-git-url "https://example.com/repo.git#v1.0")))72
(assert-equal "v1.0" (git-url-ref parsed))))74
(test "http URL"75
(let ((parsed (parse-git-url "http://example.com/repo.git")))76
(assert-equal 'url (git-url-forge parsed))))78
(test "git:// URL"79
(let ((parsed (parse-git-url "git://example.com/repo.git")))80
(assert-equal 'url (git-url-forge parsed)))))82
;; ============================================================83
;; parse-git-url - invalid84
;; ============================================================86
(test-group "parse-git-url - invalid"87
(test "random string returns #f"88
(assert-false (parse-git-url "not-a-url")))90
(test "empty string returns #f"91
(assert-false (parse-git-url ""))))93
;; ============================================================94
;; git-url-to-clone-url95
;; ============================================================97
(test-group "git-url-to-clone-url"98
(test "forge shorthand produces HTTPS URL"99
(let* ((parsed (parse-git-url "github:user/repo"))100
(url (git-url-to-clone-url parsed)))101
(assert-equal "https://github.com/user/repo.git" url)))103
(test "codeberg shorthand"104
(let* ((parsed (parse-git-url "codeberg:org/project"))105
(url (git-url-to-clone-url parsed)))106
(assert-equal "https://codeberg.org/org/project.git" url)))108
(test "full URL passes through"109
(let* ((parsed (parse-git-url "https://example.com/repo.git"))110
(url (git-url-to-clone-url parsed)))111
(assert-equal "https://example.com/repo.git" url))))113
;; ============================================================114
;; git-repo-path115
;; ============================================================117
(test-group "git-repo-path"118
(test "forge shorthand produces structured path"119
(let* ((parsed (parse-git-url "github:user/repo"))120
(path (git-repo-path "/cache" parsed)))121
(assert-true (string-contains? path "github.com"))122
(assert-true (string-contains? path "user"))123
(assert-true (string-contains? path "repo.git"))))125
(test "full URL produces sanitized path"126
(let* ((parsed (parse-git-url "https://example.com/repo.git"))127
(path (git-repo-path "/cache" parsed)))128
(assert-true (string-starts-with? path "/cache/")))))130
;; ============================================================131
;; git-worktree-key132
;; ============================================================134
(test-group "git-worktree-key"135
(test "forge shorthand key"136
(let* ((parsed (parse-git-url "github:user/repo"))137
(key (git-worktree-key parsed "main")))138
(assert-equal "github-user-repo-main" key)))140
(test "full URL key"141
(let* ((parsed (parse-git-url "https://example.com/repo.git"))142
(key (git-worktree-key parsed "v1")))143
(assert-true (string-contains? key "v1")))))145
;; ============================================================146
;; git-available?147
;; ============================================================149
(test-group "git-available?"150
(test "returns boolean"151
(let ((result (git-available?)))152
(assert-true (boolean? result)))))154
(run-tests)