You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
160 lines
4.8 KiB
160 lines
4.8 KiB
# -*- tcl -*- |
|
# Maintenance Instruction: leave the 999999.xxx.x as is and use 'pmix make' or src/make.tcl to update from <pkg>-buildversion.txt |
|
# |
|
# Please consider using a BSD or MIT style license for greatest compatibility with the Tcl ecosystem. |
|
# Code using preferred Tcl licenses can be eligible for inclusion in Tcllib, Tklib and the punk package repository. |
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
|
#Copyright (c) 2023 Julian Noble |
|
#Copyright (c) 2012-2018 Andreas Kupries |
|
# - code from A.K's 'kettle' project used in this module |
|
# |
|
# @@ Meta Begin |
|
# Application punk::repo 999999.0a1.0 |
|
# Meta platform tcl |
|
# Meta license BSD |
|
# @@ Meta End |
|
|
|
|
|
|
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
|
## Requirements |
|
##e.g package require frobz |
|
|
|
|
|
|
|
|
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
|
namespace eval punk::repo { |
|
|
|
proc is_fossil {{path {}}} { |
|
if {$path eq {}} { set path [pwd] } |
|
return [expr {[find_fossil $path] ne {}}] |
|
} |
|
proc is_git {{path {}}} { |
|
if {$path eq {}} { set path [pwd] } |
|
return [expr {[find_git $path] ne {}}] |
|
} |
|
|
|
proc find_fossil {{path {}}} { |
|
if {$path eq {}} { set path [pwd] } |
|
scanup $path is_fossil_root |
|
} |
|
proc find_git {{path {}}} { |
|
if {$path eq {}} { set path [pwd] } |
|
scanup $path is_git_root |
|
} |
|
|
|
proc is_fossil_root {{path {}}} { |
|
if {$path eq {}} { set path [pwd] } |
|
#from kettle::path::is.fossil |
|
foreach control { |
|
_FOSSIL_ |
|
.fslckout |
|
.fos |
|
} { |
|
set control $path/$control |
|
if {[file exists $control] && [file isfile $control]} {return 1} |
|
} |
|
return 0 |
|
} |
|
proc is_git_root {{path {}}} { |
|
if {$path eq {}} { set path [pwd] } |
|
set control $path/.git |
|
expr {[file exists $control] && [file isdirectory $control]} |
|
} |
|
|
|
proc git_revision {{path {}}} { |
|
if {$path eq {}} { set path [pwd] } |
|
# ::kettle::path::revision.git |
|
do_in_path $path { |
|
try { |
|
set v [::exec {*}[auto_execok git] describe] |
|
} on error {e o} { |
|
set v [lindex [split [dict get $o -errorinfo] \n] 0] |
|
} |
|
} |
|
return [string trim $v] |
|
} |
|
|
|
proc fossil_revision {{path {}}} { |
|
if {$path eq {}} { set path [pwd] } |
|
# ::kettle::path::revision.fossil |
|
set fossilcmd [auto_execok fossil] |
|
if {[llength $fossilcmd]} { |
|
do_in_path $path { |
|
set info [::exec {*}$fossilcmd info] |
|
} |
|
return [lindex [grep {checkout:*} $info] 0 1] |
|
} else { |
|
return Unknown |
|
} |
|
} |
|
|
|
#temporarily cd to workpath to run script - return to correct path even on failure |
|
proc do_in_path {path script} { |
|
#from ::kettle::path::in |
|
set here [pwd] |
|
try { |
|
cd $path |
|
uplevel 1 $script |
|
} finally { |
|
cd $here |
|
} |
|
} |
|
proc scanup {path cmd} { |
|
if {$path eq {}} { set path [pwd] } |
|
#based on kettle::path::scanup |
|
set path [file normalize $path] |
|
while {1} { |
|
# Found the proper directory, per the predicate. |
|
if {[{*}$cmd $path]} { return $path } |
|
|
|
# Not found, walk to parent |
|
set new [file dirname $path] |
|
|
|
# Stop when reaching the root. |
|
if {$new eq $path} { return {} } |
|
if {$new eq {}} { return {} } |
|
|
|
# Ok, truly walk up. |
|
set path $new |
|
} |
|
return {} |
|
} |
|
|
|
proc grep {pattern data} { |
|
set data [string map [list \r\n \n] $data] |
|
return [lsearch -all -inline -glob [split $data \n] $pattern] |
|
} |
|
|
|
proc rgrep {pattern data} { |
|
set data [string map [list \r\n \n] $data] |
|
return [lsearch -all -inline -regexp [split $data \n] $pattern] |
|
} |
|
|
|
interp alias {} is_fossil {} ::punk::repo::is_fossil |
|
interp alias {} is_fossil_root {} ::punk::repo::is_fossil_root |
|
interp alias {} find_fossil {} ::punk::repo::find_fossil |
|
interp alias {} fossil_revision {} ::punk::repo::fossil_revision |
|
interp alias {} is_git {} ::punk::repo::is_git |
|
interp alias {} is_git_root {} ::punk::repo::is_git_root |
|
interp alias {} find_git {} ::punk::repo::find_git |
|
interp alias {} git_revision {} ::punk::repo::git_revision |
|
|
|
|
|
interp alias {} gs {} git status -sb |
|
interp alias {} gr {} ::punk::repo::git_revision |
|
interp alias {} gl {} git log --oneline --decorate ;#decorate so stdout consistent with what we see on console |
|
interp alias {} glast {} git log -1 HEAD --stat |
|
interp alias {} gconf {} git config --global -l |
|
|
|
} |
|
|
|
|
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
|
## Ready |
|
package provide punk::repo [namespace eval punk::repo { |
|
variable version |
|
set version 999999.0a1.0 |
|
}] |
|
return
|
|
|