#!/usr/bin/env port-tclsh # -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4 # # Generate a github group template Portfile given tarball or project URL # package require uri proc usage {{channel stderr}} { global argv0 puts $channel "Usage: $argv0 \[-github|-bitbucket \]" puts $channel "" puts $channel "URL is the github/bitbucket tarball or project URL" puts $channel "" puts $channel "Example:" puts $channel " $argv0 -github https://github.com/tmux/tmux" puts $channel " $argv0 -github https://github.com/tmux/tmux/releases/download/2.0/tmux-2.0.tar.gz" puts $channel " $argv0 -bitbucket https://bitbucket.org/sshguard/sshguard" } proc val_or_def {val def} { expr {$val ne "" ? $val : $def} } # Extract version and tag_prefix from tarball name, e.g., v0.2.3.tar.gz and v_0.1.2.tar.gz proc parse_tarball_name {tarball_name} { set version "" set tag_prefix "" if {[regexp -indices {[0-9]+([.-][0-9]+)+} $tarball_name location]} { set version [string range $tarball_name {*}$location] set tag_prefix [string range $tarball_name 0 [expr [lindex $location 0]-1]] } return [list $version $tag_prefix] } proc parse_github_url {url} { array set urlparts [uri::split $url] if {![string equal $urlparts(host) github.com]} { return -code error \ "expected github url but got \"$url\"" } set path [split $urlparts(path) /] set author [lindex $path 0] set project [lindex $path 1] set tarball [lindex $path end] set tarball_from [expr {[string match */releases/download/* $url] ? "release" : ""}] return [list $author $project {*}[parse_tarball_name $tarball] $tarball_from] } proc parse_bitbucket_url {url} { array set urlparts [uri::split $url] if {![string equal $urlparts(host) bitbucket.org]} { return -code error \ "expected bitbucket url but got \"$url\"" } set path [split $urlparts(path) /] set author [lindex $path 0] set project [lindex $path 1] set tarball [lindex $path end] return [list $author $project {*}[parse_tarball_name $tarball]] } proc request_github {author project} { set json "/tmp/${author}-${project}.json" set api "https://api.github.com/repos/${author}/${project}" exec curl --silent --max-time 5 --output $json $api set description [val_or_def [parse_json .description $json] $description] set homepage [val_or_def [parse_json .description $json] $homepage] return [list description homepage] } proc parse_json {query json} { set tmp [exec jq $query $json] set tmp [string range $tmp 1 end-1] if {[expr {[string length $tmp] > 0}]} { return $tmp } else { return "" } } set PortGroup "" set author author set project project set version version set tag_prefix tag_prefix set tarball_from "" set description replaceme set homepage "" set is_github_group false if {$argc != 2} { usage ; exit 1 } else { if {[string equal [lindex $argv 0] "-github"]} { set is_github_group true set PortGroup "github 1.0" set url [lindex $argv 1] set tmp [parse_github_url $url] set author [val_or_def [lindex $tmp 0] "author"] set project [val_or_def [lindex $tmp 1] "project"] set version [val_or_def [lindex $tmp 2] "version"] set tag_prefix [val_or_def [lindex $tmp 3] "tag_prefix"] set tarball_from [val_or_def [lindex $tmp 4] ""] set description replaceme set homepage "" # request_github } elseif {[string equal [lindex $argv 0] "-bitbucket"]} { set PortGroup "bitbucket 1.0" set url [lindex $argv 1] set tmp [parse_bitbucket_url $url] set author [val_or_def [lindex $tmp 0] "author"] set project [val_or_def [lindex $tmp 1] "project"] set version [val_or_def [lindex $tmp 2] "version"] set tag_prefix [val_or_def [lindex $tmp 3] "tag_prefix"] } else { usage ; exit 1 } } puts "# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4" puts "# \$Id\$" puts "" puts "PortSystem 1.0" puts "PortGroup ${PortGroup}" puts "" if $is_github_group { puts "github.setup ${author} ${project} ${version} ${tag_prefix}" } else { puts "bitbucket.setup ${author} ${project} ${version} ${tag_prefix}" } puts "categories replaceme" puts "platforms darwin" set maintainers "replaceme" if {[info exist env(EMAIL)] && ![string equal $env(EMAIL) ""]} { set maintainers $env(EMAIL) } puts "maintainers $maintainers" if {![string equal $homepage ""]} { puts "homepage $homepage" } puts "license replaceme" puts "" puts "description $description" puts "long_description replaceme" puts "" if {![string equal $tarball_from ""]} { puts "github.tarball_from releases" } puts "" puts "checksums rmd160 12345 \\" puts " sha256 6789a"