Julian Noble
12 months ago
139 changed files with 4270 additions and 764 deletions
@ -1,29 +0,0 @@ |
|||||||
::lindex tcl;#\ |
|
||||||
@call tclsh "%~dp0%~n0.bat" %* & goto :eof |
|
||||||
# --- --- --- --- --- --- --- --- --- --- --- --- ---begin Tcl |
|
||||||
# -*- tcl -*- |
|
||||||
# @@ Meta Begin |
|
||||||
# Application dtplite 1.0.5 |
|
||||||
# Meta platform tcl |
|
||||||
# Meta summary Lightweight DocTools Processor |
|
||||||
# Meta description This application is a simple processor |
|
||||||
# Meta description for documents written in the doctools |
|
||||||
# Meta description markup language. It covers the most |
|
||||||
# Meta description common use cases, but is not as |
|
||||||
# Meta description configurable as its big brother dtp. |
|
||||||
# Meta category Processing doctools documents |
|
||||||
# Meta subject doctools doctoc docidx |
|
||||||
# Meta require {dtplite 1.0.5} |
|
||||||
# Meta author Andreas Kupries |
|
||||||
# Meta license BSD |
|
||||||
# @@ Meta End |
|
||||||
|
|
||||||
package require dtplite 1.0.5 |
|
||||||
|
|
||||||
# dtp lite - Lightweight DocTools Processor |
|
||||||
# ======== = ============================== |
|
||||||
|
|
||||||
exit [dtplite::do $argv] |
|
||||||
|
|
||||||
# ### ### ### ######### ######### ######### |
|
||||||
exit |
|
@ -1,28 +0,0 @@ |
|||||||
#! /usr/bin/env tclsh |
|
||||||
# -*- tcl -*- |
|
||||||
|
|
||||||
# @@ Meta Begin |
|
||||||
# Application dtplite 1.0.5 |
|
||||||
# Meta platform tcl |
|
||||||
# Meta summary Lightweight DocTools Processor |
|
||||||
# Meta description This application is a simple processor |
|
||||||
# Meta description for documents written in the doctools |
|
||||||
# Meta description markup language. It covers the most |
|
||||||
# Meta description common use cases, but is not as |
|
||||||
# Meta description configurable as its big brother dtp. |
|
||||||
# Meta category Processing doctools documents |
|
||||||
# Meta subject doctools doctoc docidx |
|
||||||
# Meta require {dtplite 1.0.5} |
|
||||||
# Meta author Andreas Kupries |
|
||||||
# Meta license BSD |
|
||||||
# @@ Meta End |
|
||||||
|
|
||||||
package require dtplite 1.0.5 |
|
||||||
|
|
||||||
# dtp lite - Lightweight DocTools Processor |
|
||||||
# ======== = ============================== |
|
||||||
|
|
||||||
exit [dtplite::do $argv] |
|
||||||
|
|
||||||
# ### ### ### ######### ######### ######### |
|
||||||
exit |
|
@ -1,46 +0,0 @@ |
|||||||
::lindex tcl;#\ |
|
||||||
@call tclsh "%~dp0%~n0.bat" %* & goto :eof |
|
||||||
# --- --- --- --- --- --- --- --- --- --- --- --- ---begin Tcl |
|
||||||
#!/usr/bin/env C:/tcl/bin/tclsh.exe |
|
||||||
# -*- tcl -*- |
|
||||||
# # ## ### ##### ######## ############# ##################### |
|
||||||
## Kettle application |
|
||||||
|
|
||||||
# @@ Meta Begin |
|
||||||
# Application kettle 1 |
|
||||||
# Meta author {Andreas Kupries} |
|
||||||
# Meta build::by jnoble |
|
||||||
# Meta build::date 2023-07-20 |
|
||||||
# Meta category Builder/Developer support |
|
||||||
# Meta description Kettle is a system to make building Tcl packages quick |
|
||||||
# Meta description and easy. More importantly, possibly, to make writing |
|
||||||
# Meta description the build system for Tcl packages easy. As such kettle |
|
||||||
# Meta description is several things: (1) A DSL helping you to write build |
|
||||||
# Meta description systems for your packages. (2) A package implementing |
|
||||||
# Meta description this DSL. (3) An application which can serve as the |
|
||||||
# Meta description interpreter for a build file containing commands in the |
|
||||||
# Meta description above DSL. |
|
||||||
# Meta location https://core.tcl.tk/akupries/kettle |
|
||||||
# Meta platform tcl |
|
||||||
# Meta require {Tcl 8.5-} |
|
||||||
# Meta require kettle |
|
||||||
# Meta subject {build support} critcl teapot {meta data} doctools |
|
||||||
# Meta subject diagram |
|
||||||
# Meta summary Build support application. |
|
||||||
# Meta vc::revision fatal: No annotated tags can describe |
|
||||||
# Meta vc::revision '96a08d425f3f151966cea8a0005758fd97115958'. |
|
||||||
# Meta vc::system git |
|
||||||
# @@ Meta End |
|
||||||
|
|
||||||
apply {{self} { |
|
||||||
set selfdir [file dirname $self] |
|
||||||
if {[file exists $selfdir/kettle.tcl]} { |
|
||||||
# Look for a local copy first, for when we install ourselves. |
|
||||||
source $selfdir/kettle.tcl |
|
||||||
} else { |
|
||||||
# use the installed core. |
|
||||||
package require kettle |
|
||||||
} |
|
||||||
kettle::option::set @kettle $self |
|
||||||
kettle::Application |
|
||||||
}} [file dirname [file normalize [info script]/__]] |
|
@ -0,0 +1,71 @@ |
|||||||
|
|
||||||
|
# -*- 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. |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
# (C) 2023 |
||||||
|
# |
||||||
|
# @@ Meta Begin |
||||||
|
# Application punk::docgen 0.1.0 |
||||||
|
# Meta platform tcl |
||||||
|
# Meta license BSD |
||||||
|
# @@ Meta End |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
## Requirements |
||||||
|
##e.g package require frobz |
||||||
|
|
||||||
|
package require punk::repo |
||||||
|
|
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
namespace eval punk::docgen { |
||||||
|
proc get_doctools_comments {fname} { |
||||||
|
#does no validation of doctools commands |
||||||
|
#existence of string match #\**!doctools is taken as evidence enough that the file has inline doctools - review |
||||||
|
if {![file exists $fname]} { |
||||||
|
error "get_doctools_comments file '$fname' not found" |
||||||
|
} |
||||||
|
set fd [open $fname r] |
||||||
|
set data [read $fd] |
||||||
|
close $fd |
||||||
|
if {![string match "*#\**!doctools*" $data]} { |
||||||
|
return |
||||||
|
} |
||||||
|
set data [string map [list \r\n \n] $data] |
||||||
|
set in_doctools 0 |
||||||
|
set doctools "" |
||||||
|
foreach ln [split $data \n] { |
||||||
|
set ln [string trim $ln] |
||||||
|
if {$in_doctools && [string index $ln 0] != "#"} { |
||||||
|
set in_doctools 0 |
||||||
|
} elseif {[string range $ln 0 1] == "#*"} { |
||||||
|
#todo - process doctools ordering hints in tail of line |
||||||
|
set in_doctools 1 |
||||||
|
} elseif {$in_doctools} { |
||||||
|
append doctools [string range $ln 1 end] \n |
||||||
|
} |
||||||
|
} |
||||||
|
return $doctools |
||||||
|
} |
||||||
|
#todo - proc autogen_doctools_comments {fname} {} |
||||||
|
# - will probably need to use something like parsetcl - as we won't be able to reliably source in an interp without side-effects and use info body etc. |
||||||
|
# - mechanism will be to autodocument namespaces, procs, methods where no #*** doctools indication present - but use existing doctools comments for that particular item if it is present. |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
## Ready |
||||||
|
package provide punk::docgen [namespace eval punk::docgen { |
||||||
|
variable pkg punk::docgen |
||||||
|
variable version |
||||||
|
set version 0.1.0 |
||||||
|
}] |
||||||
|
return |
@ -0,0 +1,397 @@ |
|||||||
|
# -*- 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. |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
# (C) 2023 |
||||||
|
# |
||||||
|
# @@ Meta Begin |
||||||
|
# Application punk::path 0.1.0 |
||||||
|
# Meta platform tcl |
||||||
|
# Meta license <unspecified> |
||||||
|
# @@ Meta End |
||||||
|
|
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
# doctools header |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
#*** !doctools |
||||||
|
#[manpage_begin punkshell_module_punk::path 0 0.1.0] |
||||||
|
#[copyright "2023"] |
||||||
|
#[titledesc {Filesystem path utilities}] [comment {-- Name section and table of contents description --}] |
||||||
|
#[moddesc {punk path filesystem utils}] [comment {-- Description at end of page heading --}] |
||||||
|
#[require punk::path] |
||||||
|
#[description] |
||||||
|
#[keywords module path filesystem] |
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
|
||||||
|
#*** !doctools |
||||||
|
#[section Overview] |
||||||
|
#[para] overview of punk::path |
||||||
|
#[para] Filesystem path utility functions |
||||||
|
#[subsection Concepts] |
||||||
|
#[para] - |
||||||
|
|
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
## Requirements |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
|
||||||
|
#*** !doctools |
||||||
|
#[subsection dependencies] |
||||||
|
#[para] packages used by punk::path |
||||||
|
#[list_begin itemized] |
||||||
|
|
||||||
|
package require Tcl 8.6 |
||||||
|
#*** !doctools |
||||||
|
#[item] [package {Tcl 8.6}] |
||||||
|
|
||||||
|
# #package require frobz |
||||||
|
# #*** !doctools |
||||||
|
# #[item] [package {frobz}] |
||||||
|
|
||||||
|
#*** !doctools |
||||||
|
#[list_end] |
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
|
||||||
|
#*** !doctools |
||||||
|
#[section API] |
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
# oo::class namespace |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
namespace eval punk::path::class { |
||||||
|
#*** !doctools |
||||||
|
#[subsection {Namespace punk::path::class}] |
||||||
|
#[para] class definitions |
||||||
|
if {[info commands [namespace current]::interface_sample1] eq ""} { |
||||||
|
#*** !doctools |
||||||
|
#[list_begin enumerated] |
||||||
|
|
||||||
|
# oo::class create interface_sample1 { |
||||||
|
# #*** !doctools |
||||||
|
# #[enum] CLASS [class interface_sample1] |
||||||
|
# #[list_begin definitions] |
||||||
|
|
||||||
|
# method test {arg1} { |
||||||
|
# #*** !doctools |
||||||
|
# #[call class::interface_sample1 [method test] [arg arg1]] |
||||||
|
# #[para] test method |
||||||
|
# puts "test: $arg1" |
||||||
|
# } |
||||||
|
|
||||||
|
# #*** !doctools |
||||||
|
# #[list_end] [comment {-- end definitions interface_sample1}] |
||||||
|
# } |
||||||
|
|
||||||
|
#*** !doctools |
||||||
|
#[list_end] [comment {--- end class enumeration ---}] |
||||||
|
} |
||||||
|
} |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
# Base namespace |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
namespace eval punk::path { |
||||||
|
namespace export * |
||||||
|
#variable xyz |
||||||
|
|
||||||
|
#*** !doctools |
||||||
|
#[subsection {Namespace punk::path}] |
||||||
|
#[para] Core API functions for punk::path |
||||||
|
#[list_begin definitions] |
||||||
|
|
||||||
|
|
||||||
|
proc pathglob_as_re {pathglob} { |
||||||
|
#*** !doctools |
||||||
|
#[call [fun pathglob_as_re] [arg pathglob]] |
||||||
|
#[para] Returns a regular expression for matching a path to a glob pattern which can contain glob chars *|? in any segment of the path structure |
||||||
|
#[para] ** matches any number of subdirectories. |
||||||
|
#[para] e.g /etc/**/*.txt will match any .txt files at any depth below /etc (except directly within /etc itself) |
||||||
|
#[para] e.g /etc/**.txt will match any .txt files at any depth below /etc |
||||||
|
#[para] any segment that does not contain ** must match exactly one segment in the path |
||||||
|
#[para] e.g the glob /etc/*/*.doc - will match any .doc files that are exactly one tree level below /etc |
||||||
|
#[para] The pathglob doesn't have to contain glob characters, in which case the returned regex will match the pathglob exactly as specified. |
||||||
|
#[para] Regular expression syntax is deliberateley not supported within the pathglob string so that supplied regex characters will be treated as literals |
||||||
|
|
||||||
|
|
||||||
|
#todo - consider whether a way to escape the glob chars ? * is practical - to allow literals ? * |
||||||
|
# - would require counting immediately-preceding backslashes |
||||||
|
set pats [list] |
||||||
|
foreach seg [file split $pathglob] { |
||||||
|
if {[string range $seg end end] eq "/"} { |
||||||
|
set seg [string range $seg 0 end-1] ;# e.g c:/ -> c: / -> "" so that join at end doesn't double up |
||||||
|
} |
||||||
|
if {$seg eq "*"} { |
||||||
|
lappend pats {[^/]*} |
||||||
|
} elseif {$seg eq "**"} { |
||||||
|
lappend pats {.*} |
||||||
|
} else { |
||||||
|
set seg [string map [list {^ {\^} $ {\$} [} {\[} ( {\(} \{ \\\{ \\ {\\}] $seg] ;#treat regex characters in the input as literals |
||||||
|
set seg [string map [list . {[.]}] $seg] |
||||||
|
if {[regexp {[*?]} $seg]} { |
||||||
|
set pat [string map [list ** {.*} * {[^/]*} ? {[^/]}] $seg] |
||||||
|
lappend pats "$pat" |
||||||
|
} else { |
||||||
|
lappend pats "$seg" |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return "^[join $pats /]\$" |
||||||
|
} |
||||||
|
proc globmatchpath {pathglob path args} { |
||||||
|
#*** !doctools |
||||||
|
#[call [fun globmatchpath] [arg pathglob] [arg path] [opt {option value...}]] |
||||||
|
#[para] Return true if the pathglob matches the path |
||||||
|
#[para] see [fun pathglob_as_re] for pathglob description |
||||||
|
#[para] Caller must ensure that file separator is forward slash. (e.g use file normalize on windows) |
||||||
|
#[para] |
||||||
|
#[para] Known options: |
||||||
|
#[para] -nocase 0|1 (default 0 - case sensitive) |
||||||
|
#[para] If -nocase is not supplied - default to case sensitive *except for driveletter* |
||||||
|
#[para] ie - the driveletter alone in paths such as c:/etc will still be case insensitive. (ie c:/ETC/* will match C:/ETC/blah but not C:/etc/blah) |
||||||
|
#[para] Explicitly specifying -nocase 0 will require the entire case to match including the driveletter. |
||||||
|
|
||||||
|
set defaults [dict create\ |
||||||
|
-nocase \uFFFF\ |
||||||
|
] |
||||||
|
set known_opts [dict keys $defaults] |
||||||
|
set opts [dict merge $defaults $args] |
||||||
|
dict for {k v} $args { |
||||||
|
if {$k ni $known_opts} { |
||||||
|
error "Unrecognised options $k - known options: $known_opts" |
||||||
|
} |
||||||
|
} |
||||||
|
# -- --- --- --- --- --- |
||||||
|
set opt_nocase [dict get $opts -nocase] |
||||||
|
set explicit_nocase 1 ;#default to disprove |
||||||
|
if {$opt_nocase eq "\uFFFF"} { |
||||||
|
set opt_nocase 0 |
||||||
|
set explicit_nocase 0 |
||||||
|
} |
||||||
|
# -- --- --- --- --- --- |
||||||
|
if {$opt_nocase} { |
||||||
|
return [regexp -nocase [pathglob_as_re $pathglob] $path] |
||||||
|
} else { |
||||||
|
set re [pathglob_as_re $pathglob] |
||||||
|
if {$explicit_nocase} { |
||||||
|
set ismatch [regexp $re $path] ;#explicit -nocase 0 - require exact match of path literals including driveletter |
||||||
|
} else { |
||||||
|
#caller is using default for -nocase - which indicates case sensitivity - but we have an exception for the driveletter. |
||||||
|
set re_segments [file split $re] ;#Note that file split c:/etc gives {c:/ etc} but file split ^c:/etc gives {^c: etc} |
||||||
|
set first_seg [lindex $re_segments 0] |
||||||
|
if {[regexp {^\^(.{1}):$} $first_seg _match driveletter]} { |
||||||
|
#first part of re is like "^c:" i.e a drive letter |
||||||
|
set chars [string tolower $driveletter][string toupper $driveletter] |
||||||
|
set re [join [concat "^\[$chars\]:" [lrange $re_segments 1 end]] /] ;#rebuild re with case insensitive driveletter only - use join - not file join. file join will misinterpret leading re segment. |
||||||
|
} |
||||||
|
#puts stderr "-->re: $re" |
||||||
|
set ismatch [regexp $re $path] |
||||||
|
} |
||||||
|
} |
||||||
|
return $ismatch |
||||||
|
} |
||||||
|
|
||||||
|
#todo - implement treefiles which acts like dirfiles but allows path globbing in the same way as punk::ns::ns/ |
||||||
|
#then review if treefiles can replace dirfiles or if both should exist (dirfiles can have literal glob chars in path segments - but that is a rare usecase) |
||||||
|
proc treefilenames {basepath tailglob args} { |
||||||
|
#*** !doctools |
||||||
|
#[call [fun treefilenames] [arg basepath] [arg tailglob] [opt {option value...}]] |
||||||
|
#basic (glob based) list of filenames matching tailglob - recursive |
||||||
|
#no natsorting - so order is dependent on filesystem |
||||||
|
set defaults [dict create\ |
||||||
|
-call-depth-internal 0\ |
||||||
|
-antiglob_paths {}\ |
||||||
|
] |
||||||
|
set opts [dict merge $defaults $args] |
||||||
|
set opt_antiglob_paths [dict get $opts -antiglob_paths] |
||||||
|
set CALLDEPTH [dict get $opts -call-depth-internal] |
||||||
|
|
||||||
|
set files [list] |
||||||
|
if {$CALLDEPTH == 0} { |
||||||
|
if {![file isdirectory $basepath]} { |
||||||
|
return [list] |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
set skip 0 |
||||||
|
foreach anti $opt_antiglob_paths { |
||||||
|
if {[globmatchpath $anti $basepath]} { |
||||||
|
set skip 1 |
||||||
|
break |
||||||
|
} |
||||||
|
} |
||||||
|
if {$skip} { |
||||||
|
return [list] |
||||||
|
} |
||||||
|
|
||||||
|
#todo - account for vfs where matched path could appear to be a directory but is mounted so could be a desired match? |
||||||
|
set dirfiles [glob -nocomplain -dir $basepath -type f $tailglob] |
||||||
|
lappend files {*}$dirfiles |
||||||
|
set dirdirs [glob -nocomplain -dir $basepath -type d *] |
||||||
|
foreach dir $dirdirs { |
||||||
|
set skip 0 |
||||||
|
foreach anti $opt_antiglob_paths { |
||||||
|
if {[globmatchpath $anti $dir]} { |
||||||
|
set skip 1 |
||||||
|
break |
||||||
|
} |
||||||
|
} |
||||||
|
if {$skip} { |
||||||
|
continue |
||||||
|
} |
||||||
|
set nextargs [dict merge $args [list -call-depth-internal [incr CALLDEPTH]]] |
||||||
|
lappend files {*}[treefilenames $dir $tailglob {*}$nextargs] |
||||||
|
} |
||||||
|
return $files |
||||||
|
} |
||||||
|
|
||||||
|
#maint warning - also in punkcheck |
||||||
|
proc relative {reference location} { |
||||||
|
#*** !doctools |
||||||
|
#[call [fun relative] [arg reference] [arg location]] |
||||||
|
#[para] Taking two directory paths, a reference and a location, computes the path |
||||||
|
# of the location relative to the reference. |
||||||
|
#[list_begin itemized] |
||||||
|
#[item] |
||||||
|
#[para] Arguments: |
||||||
|
# [list_begin arguments] |
||||||
|
# [arg_def string reference] The path from which the relative path to location is determined. |
||||||
|
# [arg_def string location] The location path which may be above or below the reference path |
||||||
|
# [list_end] |
||||||
|
#[item] |
||||||
|
#[para] Results: |
||||||
|
#[para] The relative path of the location to the reference path. |
||||||
|
#[para] Will return a single dot "." if the paths are the same |
||||||
|
#[item] |
||||||
|
#[para] Notes: |
||||||
|
#[para] Both paths must be the same type - ie both absolute or both relative |
||||||
|
#[para] Case sensitive. ie relative /etc /etC |
||||||
|
# will return ../etC |
||||||
|
#[para] On windows, the drive-letter component (only) is not case sensitive |
||||||
|
#[para] ie relative c:/etc C:/etc returns . |
||||||
|
#[para] but relative c:/etc C:/Etc returns ../Etc |
||||||
|
#[para] On windows, if the paths are absolute and specifiy different volumes, only the location will be returned. |
||||||
|
# ie relative c:/etc d:/etc/blah |
||||||
|
# returns d:/etc/blah |
||||||
|
#[list_end] |
||||||
|
|
||||||
|
#see also kettle |
||||||
|
# Modified copy of ::fileutil::relative (tcllib) |
||||||
|
# Adapted to 8.5 ({*}). |
||||||
|
|
||||||
|
#review - check volume info on windows.. UNC paths? |
||||||
|
if {[file pathtype $reference] ne [file pathtype $location]} { |
||||||
|
return -code error "Unable to compute relation for paths of different pathtypes: [file pathtype $reference] vs. [file pathtype $location], ($reference vs. $location)" |
||||||
|
} |
||||||
|
|
||||||
|
#avoid normalizing if possible (file normalize *very* expensive on windows) |
||||||
|
set do_normalize 0 |
||||||
|
if {[file pathtype $reference] eq "relative"} { |
||||||
|
#if reference is relative so is location |
||||||
|
if {[regexp {[.]{2}} [list $reference $location]]} { |
||||||
|
set do_normalize 1 |
||||||
|
} |
||||||
|
if {[regexp {[.]/} [list $reference $location]]} { |
||||||
|
set do_normalize 1 |
||||||
|
} |
||||||
|
} else { |
||||||
|
set do_normalize 1 |
||||||
|
} |
||||||
|
if {$do_normalize} { |
||||||
|
set reference [file normalize $reference] |
||||||
|
set location [file normalize $location] |
||||||
|
} |
||||||
|
|
||||||
|
set save $location |
||||||
|
set reference [file split $reference] |
||||||
|
set location [file split $location] |
||||||
|
|
||||||
|
while {[lindex $location 0] eq [lindex $reference 0]} { |
||||||
|
set location [lrange $location 1 end] |
||||||
|
set reference [lrange $reference 1 end] |
||||||
|
if {![llength $location]} {break} |
||||||
|
} |
||||||
|
|
||||||
|
set location_len [llength $location] |
||||||
|
set reference_len [llength $reference] |
||||||
|
|
||||||
|
if {($location_len == 0) && ($reference_len == 0)} { |
||||||
|
# Cases: |
||||||
|
# (a) reference == location |
||||||
|
|
||||||
|
set location . |
||||||
|
} else { |
||||||
|
# Cases: |
||||||
|
# (b) ref is: ref/sub = sub |
||||||
|
# loc is: ref = {} |
||||||
|
|
||||||
|
# (c) ref is: ref = {} |
||||||
|
# loc is: ref/sub = sub |
||||||
|
|
||||||
|
while {$reference_len > 0} { |
||||||
|
set location [linsert $location 0 ..] |
||||||
|
incr reference_len -1 |
||||||
|
} |
||||||
|
set location [file join {*}$location] |
||||||
|
} |
||||||
|
return $location |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#*** !doctools |
||||||
|
#[list_end] [comment {--- end definitions namespace punk::path ---}] |
||||||
|
} |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
|
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
# Secondary API namespace |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
namespace eval punk::path::lib { |
||||||
|
namespace export * |
||||||
|
namespace path [namespace parent] |
||||||
|
#*** !doctools |
||||||
|
#[subsection {Namespace punk::path::lib}] |
||||||
|
#[para] Secondary functions that are part of the API |
||||||
|
#[list_begin definitions] |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#*** !doctools |
||||||
|
#[list_end] [comment {--- end definitions namespace punk::path::lib ---}] |
||||||
|
} |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
#*** !doctools |
||||||
|
#[section Internal] |
||||||
|
namespace eval punk::path::system { |
||||||
|
#*** !doctools |
||||||
|
#[subsection {Namespace punk::path::system}] |
||||||
|
#[para] Internal functions that are not part of the API |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
## Ready |
||||||
|
package provide punk::path [namespace eval punk::path { |
||||||
|
variable pkg punk::path |
||||||
|
variable version |
||||||
|
set version 0.1.0 |
||||||
|
}] |
||||||
|
return |
||||||
|
|
||||||
|
#*** !doctools |
||||||
|
#[manpage_end] |
||||||
|
|
@ -0,0 +1,3 @@ |
|||||||
|
[section Changes] |
||||||
|
[include changes_0.1.inc] |
||||||
|
|
@ -0,0 +1,28 @@ |
|||||||
|
[subsection {Changes for version 0.1}] |
||||||
|
|
||||||
|
This release 0.1 of project punkshell |
||||||
|
|
||||||
|
[para] Summary |
||||||
|
[list_begin enumerated] |
||||||
|
[enum] feature 1 |
||||||
|
[enum] feature 2 |
||||||
|
[list_end] |
||||||
|
|
||||||
|
|
||||||
|
[para] In detail: |
||||||
|
[list_begin enumerated] |
||||||
|
[comment {- - -- --- ----- -------- ------------- ---------------------}] |
||||||
|
|
||||||
|
[enum] punkshell requires Tcl 8.6 or higher. Tcl 8.5 or less is not |
||||||
|
supported. |
||||||
|
|
||||||
|
[comment {- - -- --- ----- -------- ------------- ---------------------}] |
||||||
|
|
||||||
|
[enum] |
||||||
|
|
||||||
|
[comment {- - -- --- ----- -------- ------------- ---------------------}] |
||||||
|
[list_end] |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[comment {- - -- --- ----- -------- ------------- ---------------------}] |
@ -0,0 +1,18 @@ |
|||||||
|
[comment {-*- tcl -*- --- !doctools --- manpage}] |
||||||
|
[comment {- - -- --- ----- -------- ------------- ---------------------}] |
||||||
|
[section {Bugs, Ideas, Feedback}] |
||||||
|
[vset project_tracker https://gitea1.intx.com.au/jn/punkshell/issues] |
||||||
|
[vset project_email julian+punkshell@precisium.com.au] |
||||||
|
|
||||||
|
This document, and the package it describes, will undoubtedly contain |
||||||
|
bugs and other problems. |
||||||
|
|
||||||
|
Please report such at the |
||||||
|
[uri [vset project_tracker] {punkshell tracker}]. |
||||||
|
|
||||||
|
Please also report any ideas for enhancements you may have for either |
||||||
|
package and/or documentation. |
||||||
|
|
||||||
|
Contact: [uri mailto:[vset project_email] [vset project_email]] |
||||||
|
|
||||||
|
|
@ -1,6 +1,6 @@ |
|||||||
[comment {-*- tcl -*- --- !doctools --- manpage}] |
[comment {-*- tcl -*- --- !doctools --- manpage}] |
||||||
[comment {- -- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---}] |
[comment {- -- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---}] |
||||||
[moddesc {punkshell - a Tcl }] |
[moddesc {punkshell - a Tcl project}] |
||||||
[category {shell}] |
[category {shell}] |
||||||
[keywords shell repl punk] |
[keywords shell repl punk] |
||||||
[require Tcl 8.6] |
[require Tcl 8.6] |
||||||
|
@ -0,0 +1,3 @@ |
|||||||
|
[comment {Please consider retaining a link to PunkShell to support the project}] |
||||||
|
[vset punkshell_project https://www.gitea1.intx.com.au/jn/punkshell] |
||||||
|
[para] This project uses [uri [vset punkshell_project] {PunkShell}] as a deployment management and documentation tool. |
@ -0,0 +1,15 @@ |
|||||||
|
[comment {-*- tcl -*- doctools manpage}] |
||||||
|
[manpage_begin punkshell__project_changes n 8] |
||||||
|
[include include/general.inc] |
||||||
|
[category changelog] [comment {-- override category from general.inc -- }] |
||||||
|
[keywords changelog] [comment {-- additional keyword to those from general.inc --}] |
||||||
|
[titledesc {punkshell Changes}] |
||||||
|
[description] |
||||||
|
[include include/welcome_basic.inc] |
||||||
|
[para] |
||||||
|
This document provides an overview of the changes [package punkshell] |
||||||
|
underwent from version to version. |
||||||
|
|
||||||
|
[include include/changes.inc] |
||||||
|
[include include/feedback.inc] |
||||||
|
[manpage_end] |
@ -0,0 +1,15 @@ |
|||||||
|
[comment {-*- tcl -*- doctools manpage}] |
||||||
|
[manpage_begin punkshell__project_intro n 8] |
||||||
|
[include include/general.inc] |
||||||
|
[titledesc {Introduction to punkshell}] |
||||||
|
[description] |
||||||
|
[include include/welcome_basic.inc] |
||||||
|
[para] |
||||||
|
Introduction to punkshell |
||||||
|
|
||||||
|
[include include/feedback.inc] |
||||||
|
|
||||||
|
[comment {Please consider retaining a link to PunkShell to support the project}] |
||||||
|
[include include/punkshell.inc] |
||||||
|
[manpage_end] |
||||||
|
|
@ -0,0 +1,313 @@ |
|||||||
|
'\" |
||||||
|
'\" Generated from file 'project_changes\&.man' by tcllib/doctools with format 'nroff' |
||||||
|
'\" |
||||||
|
.TH "punkshell__project_changes" n 8 doc "punkshell - a Tcl project" |
||||||
|
.\" The -*- nroff -*- definitions below are for supplemental macros used |
||||||
|
.\" in Tcl/Tk manual entries. |
||||||
|
.\" |
||||||
|
.\" .AP type name in/out ?indent? |
||||||
|
.\" Start paragraph describing an argument to a library procedure. |
||||||
|
.\" type is type of argument (int, etc.), in/out is either "in", "out", |
||||||
|
.\" or "in/out" to describe whether procedure reads or modifies arg, |
||||||
|
.\" and indent is equivalent to second arg of .IP (shouldn't ever be |
||||||
|
.\" needed; use .AS below instead) |
||||||
|
.\" |
||||||
|
.\" .AS ?type? ?name? |
||||||
|
.\" Give maximum sizes of arguments for setting tab stops. Type and |
||||||
|
.\" name are examples of largest possible arguments that will be passed |
||||||
|
.\" to .AP later. If args are omitted, default tab stops are used. |
||||||
|
.\" |
||||||
|
.\" .BS |
||||||
|
.\" Start box enclosure. From here until next .BE, everything will be |
||||||
|
.\" enclosed in one large box. |
||||||
|
.\" |
||||||
|
.\" .BE |
||||||
|
.\" End of box enclosure. |
||||||
|
.\" |
||||||
|
.\" .CS |
||||||
|
.\" Begin code excerpt. |
||||||
|
.\" |
||||||
|
.\" .CE |
||||||
|
.\" End code excerpt. |
||||||
|
.\" |
||||||
|
.\" .VS ?version? ?br? |
||||||
|
.\" Begin vertical sidebar, for use in marking newly-changed parts |
||||||
|
.\" of man pages. The first argument is ignored and used for recording |
||||||
|
.\" the version when the .VS was added, so that the sidebars can be |
||||||
|
.\" found and removed when they reach a certain age. If another argument |
||||||
|
.\" is present, then a line break is forced before starting the sidebar. |
||||||
|
.\" |
||||||
|
.\" .VE |
||||||
|
.\" End of vertical sidebar. |
||||||
|
.\" |
||||||
|
.\" .DS |
||||||
|
.\" Begin an indented unfilled display. |
||||||
|
.\" |
||||||
|
.\" .DE |
||||||
|
.\" End of indented unfilled display. |
||||||
|
.\" |
||||||
|
.\" .SO ?manpage? |
||||||
|
.\" Start of list of standard options for a Tk widget. The manpage |
||||||
|
.\" argument defines where to look up the standard options; if |
||||||
|
.\" omitted, defaults to "options". The options follow on successive |
||||||
|
.\" lines, in three columns separated by tabs. |
||||||
|
.\" |
||||||
|
.\" .SE |
||||||
|
.\" End of list of standard options for a Tk widget. |
||||||
|
.\" |
||||||
|
.\" .OP cmdName dbName dbClass |
||||||
|
.\" Start of description of a specific option. cmdName gives the |
||||||
|
.\" option's name as specified in the class command, dbName gives |
||||||
|
.\" the option's name in the option database, and dbClass gives |
||||||
|
.\" the option's class in the option database. |
||||||
|
.\" |
||||||
|
.\" .UL arg1 arg2 |
||||||
|
.\" Print arg1 underlined, then print arg2 normally. |
||||||
|
.\" |
||||||
|
.\" .QW arg1 ?arg2? |
||||||
|
.\" Print arg1 in quotes, then arg2 normally (for trailing punctuation). |
||||||
|
.\" |
||||||
|
.\" .PQ arg1 ?arg2? |
||||||
|
.\" Print an open parenthesis, arg1 in quotes, then arg2 normally |
||||||
|
.\" (for trailing punctuation) and then a closing parenthesis. |
||||||
|
.\" |
||||||
|
.\" # Set up traps and other miscellaneous stuff for Tcl/Tk man pages. |
||||||
|
.if t .wh -1.3i ^B |
||||||
|
.nr ^l \n(.l |
||||||
|
.ad b |
||||||
|
.\" # Start an argument description |
||||||
|
.de AP |
||||||
|
.ie !"\\$4"" .TP \\$4 |
||||||
|
.el \{\ |
||||||
|
. ie !"\\$2"" .TP \\n()Cu |
||||||
|
. el .TP 15 |
||||||
|
.\} |
||||||
|
.ta \\n()Au \\n()Bu |
||||||
|
.ie !"\\$3"" \{\ |
||||||
|
\&\\$1 \\fI\\$2\\fP (\\$3) |
||||||
|
.\".b |
||||||
|
.\} |
||||||
|
.el \{\ |
||||||
|
.br |
||||||
|
.ie !"\\$2"" \{\ |
||||||
|
\&\\$1 \\fI\\$2\\fP |
||||||
|
.\} |
||||||
|
.el \{\ |
||||||
|
\&\\fI\\$1\\fP |
||||||
|
.\} |
||||||
|
.\} |
||||||
|
.. |
||||||
|
.\" # define tabbing values for .AP |
||||||
|
.de AS |
||||||
|
.nr )A 10n |
||||||
|
.if !"\\$1"" .nr )A \\w'\\$1'u+3n |
||||||
|
.nr )B \\n()Au+15n |
||||||
|
.\" |
||||||
|
.if !"\\$2"" .nr )B \\w'\\$2'u+\\n()Au+3n |
||||||
|
.nr )C \\n()Bu+\\w'(in/out)'u+2n |
||||||
|
.. |
||||||
|
.AS Tcl_Interp Tcl_CreateInterp in/out |
||||||
|
.\" # BS - start boxed text |
||||||
|
.\" # ^y = starting y location |
||||||
|
.\" # ^b = 1 |
||||||
|
.de BS |
||||||
|
.br |
||||||
|
.mk ^y |
||||||
|
.nr ^b 1u |
||||||
|
.if n .nf |
||||||
|
.if n .ti 0 |
||||||
|
.if n \l'\\n(.lu\(ul' |
||||||
|
.if n .fi |
||||||
|
.. |
||||||
|
.\" # BE - end boxed text (draw box now) |
||||||
|
.de BE |
||||||
|
.nf |
||||||
|
.ti 0 |
||||||
|
.mk ^t |
||||||
|
.ie n \l'\\n(^lu\(ul' |
||||||
|
.el \{\ |
||||||
|
.\" Draw four-sided box normally, but don't draw top of |
||||||
|
.\" box if the box started on an earlier page. |
||||||
|
.ie !\\n(^b-1 \{\ |
||||||
|
\h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul' |
||||||
|
.\} |
||||||
|
.el \}\ |
||||||
|
\h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul' |
||||||
|
.\} |
||||||
|
.\} |
||||||
|
.fi |
||||||
|
.br |
||||||
|
.nr ^b 0 |
||||||
|
.. |
||||||
|
.\" # VS - start vertical sidebar |
||||||
|
.\" # ^Y = starting y location |
||||||
|
.\" # ^v = 1 (for troff; for nroff this doesn't matter) |
||||||
|
.de VS |
||||||
|
.if !"\\$2"" .br |
||||||
|
.mk ^Y |
||||||
|
.ie n 'mc \s12\(br\s0 |
||||||
|
.el .nr ^v 1u |
||||||
|
.. |
||||||
|
.\" # VE - end of vertical sidebar |
||||||
|
.de VE |
||||||
|
.ie n 'mc |
||||||
|
.el \{\ |
||||||
|
.ev 2 |
||||||
|
.nf |
||||||
|
.ti 0 |
||||||
|
.mk ^t |
||||||
|
\h'|\\n(^lu+3n'\L'|\\n(^Yu-1v\(bv'\v'\\n(^tu+1v-\\n(^Yu'\h'-|\\n(^lu+3n' |
||||||
|
.sp -1 |
||||||
|
.fi |
||||||
|
.ev |
||||||
|
.\} |
||||||
|
.nr ^v 0 |
||||||
|
.. |
||||||
|
.\" # Special macro to handle page bottom: finish off current |
||||||
|
.\" # box/sidebar if in box/sidebar mode, then invoked standard |
||||||
|
.\" # page bottom macro. |
||||||
|
.de ^B |
||||||
|
.ev 2 |
||||||
|
'ti 0 |
||||||
|
'nf |
||||||
|
.mk ^t |
||||||
|
.if \\n(^b \{\ |
||||||
|
.\" Draw three-sided box if this is the box's first page, |
||||||
|
.\" draw two sides but no top otherwise. |
||||||
|
.ie !\\n(^b-1 \h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c |
||||||
|
.el \h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c |
||||||
|
.\} |
||||||
|
.if \\n(^v \{\ |
||||||
|
.nr ^x \\n(^tu+1v-\\n(^Yu |
||||||
|
\kx\h'-\\nxu'\h'|\\n(^lu+3n'\ky\L'-\\n(^xu'\v'\\n(^xu'\h'|0u'\c |
||||||
|
.\} |
||||||
|
.bp |
||||||
|
'fi |
||||||
|
.ev |
||||||
|
.if \\n(^b \{\ |
||||||
|
.mk ^y |
||||||
|
.nr ^b 2 |
||||||
|
.\} |
||||||
|
.if \\n(^v \{\ |
||||||
|
.mk ^Y |
||||||
|
.\} |
||||||
|
.. |
||||||
|
.\" # DS - begin display |
||||||
|
.de DS |
||||||
|
.RS |
||||||
|
.nf |
||||||
|
.sp |
||||||
|
.. |
||||||
|
.\" # DE - end display |
||||||
|
.de DE |
||||||
|
.fi |
||||||
|
.RE |
||||||
|
.sp |
||||||
|
.. |
||||||
|
.\" # SO - start of list of standard options |
||||||
|
.de SO |
||||||
|
'ie '\\$1'' .ds So \\fBoptions\\fR |
||||||
|
'el .ds So \\fB\\$1\\fR |
||||||
|
.SH "STANDARD OPTIONS" |
||||||
|
.LP |
||||||
|
.nf |
||||||
|
.ta 5.5c 11c |
||||||
|
.ft B |
||||||
|
.. |
||||||
|
.\" # SE - end of list of standard options |
||||||
|
.de SE |
||||||
|
.fi |
||||||
|
.ft R |
||||||
|
.LP |
||||||
|
See the \\*(So manual entry for details on the standard options. |
||||||
|
.. |
||||||
|
.\" # OP - start of full description for a single option |
||||||
|
.de OP |
||||||
|
.LP |
||||||
|
.nf |
||||||
|
.ta 4c |
||||||
|
Command-Line Name: \\fB\\$1\\fR |
||||||
|
Database Name: \\fB\\$2\\fR |
||||||
|
Database Class: \\fB\\$3\\fR |
||||||
|
.fi |
||||||
|
.IP |
||||||
|
.. |
||||||
|
.\" # CS - begin code excerpt |
||||||
|
.de CS |
||||||
|
.RS |
||||||
|
.nf |
||||||
|
.ta .25i .5i .75i 1i |
||||||
|
.. |
||||||
|
.\" # CE - end code excerpt |
||||||
|
.de CE |
||||||
|
.fi |
||||||
|
.RE |
||||||
|
.. |
||||||
|
.\" # UL - underline word |
||||||
|
.de UL |
||||||
|
\\$1\l'|0\(ul'\\$2 |
||||||
|
.. |
||||||
|
.\" # QW - apply quotation marks to word |
||||||
|
.de QW |
||||||
|
.ie '\\*(lq'"' ``\\$1''\\$2 |
||||||
|
.\"" fix emacs highlighting |
||||||
|
.el \\*(lq\\$1\\*(rq\\$2 |
||||||
|
.. |
||||||
|
.\" # PQ - apply parens and quotation marks to word |
||||||
|
.de PQ |
||||||
|
.ie '\\*(lq'"' (``\\$1''\\$2)\\$3 |
||||||
|
.\"" fix emacs highlighting |
||||||
|
.el (\\*(lq\\$1\\*(rq\\$2)\\$3 |
||||||
|
.. |
||||||
|
.\" # QR - quoted range |
||||||
|
.de QR |
||||||
|
.ie '\\*(lq'"' ``\\$1''\\-``\\$2''\\$3 |
||||||
|
.\"" fix emacs highlighting |
||||||
|
.el \\*(lq\\$1\\*(rq\\-\\*(lq\\$2\\*(rq\\$3 |
||||||
|
.. |
||||||
|
.\" # MT - "empty" string |
||||||
|
.de MT |
||||||
|
.QW "" |
||||||
|
.. |
||||||
|
.BS |
||||||
|
.SH NAME |
||||||
|
punkshell__project_changes \- punkshell Changes |
||||||
|
.SH SYNOPSIS |
||||||
|
package require \fBTcl 8\&.6\fR |
||||||
|
.sp |
||||||
|
.BE |
||||||
|
.SH DESCRIPTION |
||||||
|
.PP |
||||||
|
Welcome to the punkshell project\&. |
||||||
|
.PP |
||||||
|
This document provides an overview of the changes \fBpunkshell\fR |
||||||
|
underwent from version to version\&. |
||||||
|
.SH CHANGES |
||||||
|
.SS "CHANGES FOR VERSION 0\&.1" |
||||||
|
This release 0\&.1 of project punkshell |
||||||
|
.PP |
||||||
|
Summary |
||||||
|
.IP [1] |
||||||
|
feature 1 |
||||||
|
.IP [2] |
||||||
|
feature 2 |
||||||
|
.PP |
||||||
|
.PP |
||||||
|
In detail: |
||||||
|
.IP [1] |
||||||
|
punkshell requires Tcl 8\&.6 or higher\&. Tcl 8\&.5 or less is not |
||||||
|
supported\&. |
||||||
|
.IP [2] |
||||||
|
.PP |
||||||
|
.SH "BUGS, IDEAS, FEEDBACK" |
||||||
|
This document, and the package it describes, will undoubtedly contain |
||||||
|
bugs and other problems\&. |
||||||
|
Please report such at the |
||||||
|
\fIpunkshell tracker\fR [https://gitea1\&.intx\&.com\&.au/jn/punkshell/issues]\&. |
||||||
|
Please also report any ideas for enhancements you may have for either |
||||||
|
package and/or documentation\&. |
||||||
|
Contact: \fIjulian+punkshell@precisium\&.com\&.au\fR [mailto:julian+punkshell@precisium\&.com\&.au] |
||||||
|
.SH KEYWORDS |
||||||
|
changelog, punk, repl, shell |
||||||
|
.SH CATEGORY |
||||||
|
changelog |
@ -0,0 +1,297 @@ |
|||||||
|
'\" |
||||||
|
'\" Generated from file 'project_intro\&.man' by tcllib/doctools with format 'nroff' |
||||||
|
'\" |
||||||
|
.TH "punkshell__project_intro" n 8 doc "punkshell - a Tcl project" |
||||||
|
.\" The -*- nroff -*- definitions below are for supplemental macros used |
||||||
|
.\" in Tcl/Tk manual entries. |
||||||
|
.\" |
||||||
|
.\" .AP type name in/out ?indent? |
||||||
|
.\" Start paragraph describing an argument to a library procedure. |
||||||
|
.\" type is type of argument (int, etc.), in/out is either "in", "out", |
||||||
|
.\" or "in/out" to describe whether procedure reads or modifies arg, |
||||||
|
.\" and indent is equivalent to second arg of .IP (shouldn't ever be |
||||||
|
.\" needed; use .AS below instead) |
||||||
|
.\" |
||||||
|
.\" .AS ?type? ?name? |
||||||
|
.\" Give maximum sizes of arguments for setting tab stops. Type and |
||||||
|
.\" name are examples of largest possible arguments that will be passed |
||||||
|
.\" to .AP later. If args are omitted, default tab stops are used. |
||||||
|
.\" |
||||||
|
.\" .BS |
||||||
|
.\" Start box enclosure. From here until next .BE, everything will be |
||||||
|
.\" enclosed in one large box. |
||||||
|
.\" |
||||||
|
.\" .BE |
||||||
|
.\" End of box enclosure. |
||||||
|
.\" |
||||||
|
.\" .CS |
||||||
|
.\" Begin code excerpt. |
||||||
|
.\" |
||||||
|
.\" .CE |
||||||
|
.\" End code excerpt. |
||||||
|
.\" |
||||||
|
.\" .VS ?version? ?br? |
||||||
|
.\" Begin vertical sidebar, for use in marking newly-changed parts |
||||||
|
.\" of man pages. The first argument is ignored and used for recording |
||||||
|
.\" the version when the .VS was added, so that the sidebars can be |
||||||
|
.\" found and removed when they reach a certain age. If another argument |
||||||
|
.\" is present, then a line break is forced before starting the sidebar. |
||||||
|
.\" |
||||||
|
.\" .VE |
||||||
|
.\" End of vertical sidebar. |
||||||
|
.\" |
||||||
|
.\" .DS |
||||||
|
.\" Begin an indented unfilled display. |
||||||
|
.\" |
||||||
|
.\" .DE |
||||||
|
.\" End of indented unfilled display. |
||||||
|
.\" |
||||||
|
.\" .SO ?manpage? |
||||||
|
.\" Start of list of standard options for a Tk widget. The manpage |
||||||
|
.\" argument defines where to look up the standard options; if |
||||||
|
.\" omitted, defaults to "options". The options follow on successive |
||||||
|
.\" lines, in three columns separated by tabs. |
||||||
|
.\" |
||||||
|
.\" .SE |
||||||
|
.\" End of list of standard options for a Tk widget. |
||||||
|
.\" |
||||||
|
.\" .OP cmdName dbName dbClass |
||||||
|
.\" Start of description of a specific option. cmdName gives the |
||||||
|
.\" option's name as specified in the class command, dbName gives |
||||||
|
.\" the option's name in the option database, and dbClass gives |
||||||
|
.\" the option's class in the option database. |
||||||
|
.\" |
||||||
|
.\" .UL arg1 arg2 |
||||||
|
.\" Print arg1 underlined, then print arg2 normally. |
||||||
|
.\" |
||||||
|
.\" .QW arg1 ?arg2? |
||||||
|
.\" Print arg1 in quotes, then arg2 normally (for trailing punctuation). |
||||||
|
.\" |
||||||
|
.\" .PQ arg1 ?arg2? |
||||||
|
.\" Print an open parenthesis, arg1 in quotes, then arg2 normally |
||||||
|
.\" (for trailing punctuation) and then a closing parenthesis. |
||||||
|
.\" |
||||||
|
.\" # Set up traps and other miscellaneous stuff for Tcl/Tk man pages. |
||||||
|
.if t .wh -1.3i ^B |
||||||
|
.nr ^l \n(.l |
||||||
|
.ad b |
||||||
|
.\" # Start an argument description |
||||||
|
.de AP |
||||||
|
.ie !"\\$4"" .TP \\$4 |
||||||
|
.el \{\ |
||||||
|
. ie !"\\$2"" .TP \\n()Cu |
||||||
|
. el .TP 15 |
||||||
|
.\} |
||||||
|
.ta \\n()Au \\n()Bu |
||||||
|
.ie !"\\$3"" \{\ |
||||||
|
\&\\$1 \\fI\\$2\\fP (\\$3) |
||||||
|
.\".b |
||||||
|
.\} |
||||||
|
.el \{\ |
||||||
|
.br |
||||||
|
.ie !"\\$2"" \{\ |
||||||
|
\&\\$1 \\fI\\$2\\fP |
||||||
|
.\} |
||||||
|
.el \{\ |
||||||
|
\&\\fI\\$1\\fP |
||||||
|
.\} |
||||||
|
.\} |
||||||
|
.. |
||||||
|
.\" # define tabbing values for .AP |
||||||
|
.de AS |
||||||
|
.nr )A 10n |
||||||
|
.if !"\\$1"" .nr )A \\w'\\$1'u+3n |
||||||
|
.nr )B \\n()Au+15n |
||||||
|
.\" |
||||||
|
.if !"\\$2"" .nr )B \\w'\\$2'u+\\n()Au+3n |
||||||
|
.nr )C \\n()Bu+\\w'(in/out)'u+2n |
||||||
|
.. |
||||||
|
.AS Tcl_Interp Tcl_CreateInterp in/out |
||||||
|
.\" # BS - start boxed text |
||||||
|
.\" # ^y = starting y location |
||||||
|
.\" # ^b = 1 |
||||||
|
.de BS |
||||||
|
.br |
||||||
|
.mk ^y |
||||||
|
.nr ^b 1u |
||||||
|
.if n .nf |
||||||
|
.if n .ti 0 |
||||||
|
.if n \l'\\n(.lu\(ul' |
||||||
|
.if n .fi |
||||||
|
.. |
||||||
|
.\" # BE - end boxed text (draw box now) |
||||||
|
.de BE |
||||||
|
.nf |
||||||
|
.ti 0 |
||||||
|
.mk ^t |
||||||
|
.ie n \l'\\n(^lu\(ul' |
||||||
|
.el \{\ |
||||||
|
.\" Draw four-sided box normally, but don't draw top of |
||||||
|
.\" box if the box started on an earlier page. |
||||||
|
.ie !\\n(^b-1 \{\ |
||||||
|
\h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul' |
||||||
|
.\} |
||||||
|
.el \}\ |
||||||
|
\h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul' |
||||||
|
.\} |
||||||
|
.\} |
||||||
|
.fi |
||||||
|
.br |
||||||
|
.nr ^b 0 |
||||||
|
.. |
||||||
|
.\" # VS - start vertical sidebar |
||||||
|
.\" # ^Y = starting y location |
||||||
|
.\" # ^v = 1 (for troff; for nroff this doesn't matter) |
||||||
|
.de VS |
||||||
|
.if !"\\$2"" .br |
||||||
|
.mk ^Y |
||||||
|
.ie n 'mc \s12\(br\s0 |
||||||
|
.el .nr ^v 1u |
||||||
|
.. |
||||||
|
.\" # VE - end of vertical sidebar |
||||||
|
.de VE |
||||||
|
.ie n 'mc |
||||||
|
.el \{\ |
||||||
|
.ev 2 |
||||||
|
.nf |
||||||
|
.ti 0 |
||||||
|
.mk ^t |
||||||
|
\h'|\\n(^lu+3n'\L'|\\n(^Yu-1v\(bv'\v'\\n(^tu+1v-\\n(^Yu'\h'-|\\n(^lu+3n' |
||||||
|
.sp -1 |
||||||
|
.fi |
||||||
|
.ev |
||||||
|
.\} |
||||||
|
.nr ^v 0 |
||||||
|
.. |
||||||
|
.\" # Special macro to handle page bottom: finish off current |
||||||
|
.\" # box/sidebar if in box/sidebar mode, then invoked standard |
||||||
|
.\" # page bottom macro. |
||||||
|
.de ^B |
||||||
|
.ev 2 |
||||||
|
'ti 0 |
||||||
|
'nf |
||||||
|
.mk ^t |
||||||
|
.if \\n(^b \{\ |
||||||
|
.\" Draw three-sided box if this is the box's first page, |
||||||
|
.\" draw two sides but no top otherwise. |
||||||
|
.ie !\\n(^b-1 \h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c |
||||||
|
.el \h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c |
||||||
|
.\} |
||||||
|
.if \\n(^v \{\ |
||||||
|
.nr ^x \\n(^tu+1v-\\n(^Yu |
||||||
|
\kx\h'-\\nxu'\h'|\\n(^lu+3n'\ky\L'-\\n(^xu'\v'\\n(^xu'\h'|0u'\c |
||||||
|
.\} |
||||||
|
.bp |
||||||
|
'fi |
||||||
|
.ev |
||||||
|
.if \\n(^b \{\ |
||||||
|
.mk ^y |
||||||
|
.nr ^b 2 |
||||||
|
.\} |
||||||
|
.if \\n(^v \{\ |
||||||
|
.mk ^Y |
||||||
|
.\} |
||||||
|
.. |
||||||
|
.\" # DS - begin display |
||||||
|
.de DS |
||||||
|
.RS |
||||||
|
.nf |
||||||
|
.sp |
||||||
|
.. |
||||||
|
.\" # DE - end display |
||||||
|
.de DE |
||||||
|
.fi |
||||||
|
.RE |
||||||
|
.sp |
||||||
|
.. |
||||||
|
.\" # SO - start of list of standard options |
||||||
|
.de SO |
||||||
|
'ie '\\$1'' .ds So \\fBoptions\\fR |
||||||
|
'el .ds So \\fB\\$1\\fR |
||||||
|
.SH "STANDARD OPTIONS" |
||||||
|
.LP |
||||||
|
.nf |
||||||
|
.ta 5.5c 11c |
||||||
|
.ft B |
||||||
|
.. |
||||||
|
.\" # SE - end of list of standard options |
||||||
|
.de SE |
||||||
|
.fi |
||||||
|
.ft R |
||||||
|
.LP |
||||||
|
See the \\*(So manual entry for details on the standard options. |
||||||
|
.. |
||||||
|
.\" # OP - start of full description for a single option |
||||||
|
.de OP |
||||||
|
.LP |
||||||
|
.nf |
||||||
|
.ta 4c |
||||||
|
Command-Line Name: \\fB\\$1\\fR |
||||||
|
Database Name: \\fB\\$2\\fR |
||||||
|
Database Class: \\fB\\$3\\fR |
||||||
|
.fi |
||||||
|
.IP |
||||||
|
.. |
||||||
|
.\" # CS - begin code excerpt |
||||||
|
.de CS |
||||||
|
.RS |
||||||
|
.nf |
||||||
|
.ta .25i .5i .75i 1i |
||||||
|
.. |
||||||
|
.\" # CE - end code excerpt |
||||||
|
.de CE |
||||||
|
.fi |
||||||
|
.RE |
||||||
|
.. |
||||||
|
.\" # UL - underline word |
||||||
|
.de UL |
||||||
|
\\$1\l'|0\(ul'\\$2 |
||||||
|
.. |
||||||
|
.\" # QW - apply quotation marks to word |
||||||
|
.de QW |
||||||
|
.ie '\\*(lq'"' ``\\$1''\\$2 |
||||||
|
.\"" fix emacs highlighting |
||||||
|
.el \\*(lq\\$1\\*(rq\\$2 |
||||||
|
.. |
||||||
|
.\" # PQ - apply parens and quotation marks to word |
||||||
|
.de PQ |
||||||
|
.ie '\\*(lq'"' (``\\$1''\\$2)\\$3 |
||||||
|
.\"" fix emacs highlighting |
||||||
|
.el (\\*(lq\\$1\\*(rq\\$2)\\$3 |
||||||
|
.. |
||||||
|
.\" # QR - quoted range |
||||||
|
.de QR |
||||||
|
.ie '\\*(lq'"' ``\\$1''\\-``\\$2''\\$3 |
||||||
|
.\"" fix emacs highlighting |
||||||
|
.el \\*(lq\\$1\\*(rq\\-\\*(lq\\$2\\*(rq\\$3 |
||||||
|
.. |
||||||
|
.\" # MT - "empty" string |
||||||
|
.de MT |
||||||
|
.QW "" |
||||||
|
.. |
||||||
|
.BS |
||||||
|
.SH NAME |
||||||
|
punkshell__project_intro \- Introduction to punkshell |
||||||
|
.SH SYNOPSIS |
||||||
|
package require \fBTcl 8\&.6\fR |
||||||
|
.sp |
||||||
|
.BE |
||||||
|
.SH DESCRIPTION |
||||||
|
.PP |
||||||
|
Welcome to the punkshell project\&. |
||||||
|
.PP |
||||||
|
Introduction to punkshell |
||||||
|
.SH "BUGS, IDEAS, FEEDBACK" |
||||||
|
This document, and the package it describes, will undoubtedly contain |
||||||
|
bugs and other problems\&. |
||||||
|
Please report such at the |
||||||
|
\fIpunkshell tracker\fR [https://gitea1\&.intx\&.com\&.au/jn/punkshell/issues]\&. |
||||||
|
Please also report any ideas for enhancements you may have for either |
||||||
|
package and/or documentation\&. |
||||||
|
Contact: \fIjulian+punkshell@precisium\&.com\&.au\fR [mailto:julian+punkshell@precisium\&.com\&.au] |
||||||
|
.PP |
||||||
|
This project uses \fIPunkShell\fR [https://www\&.gitea1\&.intx\&.com\&.au/jn/punkshell] as a deployment management and documentation tool\&. |
||||||
|
.SH KEYWORDS |
||||||
|
punk, repl, shell |
||||||
|
.SH CATEGORY |
||||||
|
shell |
@ -1,6 +1,8 @@ |
|||||||
[toc_begin {Table Of Contents} doc] |
[toc_begin {Table Of Contents} doc] |
||||||
[item doc/files/punk/_module_cap-0.1.0.tm.md punk::cap {capability provider and handler plugin system}] |
|
||||||
[item doc/files/punk/mix/commandset/_module_project-0.1.0.tm.md punk::mix::commandset::project {pmix commandset - project}] |
|
||||||
[item doc/files/punk/_module_path-0.1.0.tm.md punk::path {Filesystem path utilities}] |
|
||||||
[item doc/files/main.md punkshell {punkshell - Core}] |
[item doc/files/main.md punkshell {punkshell - Core}] |
||||||
|
[item doc/files/project_changes.md punkshell__project_changes {punkshell Changes}] |
||||||
|
[item doc/files/project_intro.md punkshell__project_intro {Introduction to punkshell}] |
||||||
|
[item doc/files/punk/_module_cap-0.1.0.tm.md punkshell_module_punk::cap {capability provider and handler plugin system}] |
||||||
|
[item doc/files/punk/mix/commandset/_module_project-0.1.0.tm.md punkshell_module_punk::mix::commandset::project {pmix commandset - project}] |
||||||
|
[item doc/files/punk/_module_path-0.1.0.tm.md punkshell_module_punk::path {Filesystem path utilities}] |
||||||
[toc_end] |
[toc_end] |
||||||
|
@ -1 +1 @@ |
|||||||
{shell {{doc/files/main.md punkshell}} punk {{doc/files/main.md punkshell}} repl {{doc/files/main.md punkshell}}} {{repl doc/files/main.md punkshell} . {shell doc/files/main.md punkshell} . {punk doc/files/main.md punkshell} .} 3 {shell shell punk punk repl repl} |
{shell {{doc/files/project_intro.md punkshell__project_intro} {doc/files/project_changes.md punkshell__project_changes} {doc/files/main.md punkshell}} changelog {{doc/files/project_changes.md punkshell__project_changes}} filesystem {{doc/files/punk/_module_path-0.1.0.tm.md punkshell_module_punk::path}} path {{doc/files/punk/_module_path-0.1.0.tm.md punkshell_module_punk::path}} capability {{doc/files/punk/_module_cap-0.1.0.tm.md punkshell_module_punk::cap}} module {{doc/files/punk/_module_cap-0.1.0.tm.md punkshell_module_punk::cap} {doc/files/punk/_module_path-0.1.0.tm.md punkshell_module_punk::path}} punk {{doc/files/project_intro.md punkshell__project_intro} {doc/files/project_changes.md punkshell__project_changes} {doc/files/main.md punkshell}} plugin {{doc/files/punk/_module_cap-0.1.0.tm.md punkshell_module_punk::cap}} repl {{doc/files/project_intro.md punkshell__project_intro} {doc/files/project_changes.md punkshell__project_changes} {doc/files/main.md punkshell}}} {{changelog doc/files/project_changes.md punkshell__project_changes} . {shell doc/files/project_changes.md punkshell__project_changes} . {shell doc/files/main.md punkshell} . {repl doc/files/project_intro.md punkshell__project_intro} . {module doc/files/punk/_module_cap-0.1.0.tm.md punkshell_module_punk::cap} . {plugin doc/files/punk/_module_cap-0.1.0.tm.md punkshell_module_punk::cap} . {filesystem doc/files/punk/_module_path-0.1.0.tm.md punkshell_module_punk::path} . {path doc/files/punk/_module_path-0.1.0.tm.md punkshell_module_punk::path} . {module doc/files/punk/_module_path-0.1.0.tm.md punkshell_module_punk::path} . {shell doc/files/project_intro.md punkshell__project_intro} . {punk doc/files/project_changes.md punkshell__project_changes} . {punk doc/files/main.md punkshell} . {repl doc/files/project_changes.md punkshell__project_changes} . {punk doc/files/project_intro.md punkshell__project_intro} . {repl doc/files/main.md punkshell} . {capability doc/files/punk/_module_cap-0.1.0.tm.md punkshell_module_punk::cap} .} 9 {shell shell changelog changelog filesystem filesystem path path capability capability module module punk punk plugin plugin repl repl} |
@ -1 +1 @@ |
|||||||
doc {doc/toc {{doc/files/punk/_module_cap-0.1.0.tm.md punk::cap {capability provider and handler plugin system}} {doc/files/punk/_module_path-0.1.0.tm.md punk::path {Filesystem path utilities}} {doc/files/punk/mix/commandset/_module_project-0.1.0.tm.md punk::mix::commandset::project {pmix commandset - project}} {doc/files/main.md punkshell {punkshell - Core}}}} |
doc {doc/toc {{doc/files/punk/_module_cap-0.1.0.tm.md punkshell_module_punk::cap {capability provider and handler plugin system}} {doc/files/project_intro.md punkshell__project_intro {Introduction to punkshell}} {doc/files/punk/_module_path-0.1.0.tm.md punkshell_module_punk::path {Filesystem path utilities}} {doc/files/project_changes.md punkshell__project_changes {punkshell Changes}} {doc/files/punk/mix/commandset/_module_project-0.1.0.tm.md punkshell_module_punk::mix::commandset::project {pmix commandset - project}} {doc/files/main.md punkshell {punkshell - Core}}}} |
@ -1 +1 @@ |
|||||||
sa,punk::path(0) doc/files/punk/_module_path-0.1.0.tm.md {capability provider and handler plugin system} doc/files/punk/_module_cap-0.1.0.tm.md punk::mix::commandset::project doc/files/punk/mix/commandset/_module_project-0.1.0.tm.md punk::mix::commandset::project(0) doc/files/punk/mix/commandset/_module_project-0.1.0.tm.md repl {index.md repl} kw,punk {index.md punk} punkshell(n) doc/files/main.md sa,punk::cap doc/files/punk/_module_cap-0.1.0.tm.md {Filesystem path utilities} doc/files/punk/_module_path-0.1.0.tm.md punkshell doc/files/main.md sa,punk::cap(0) doc/files/punk/_module_cap-0.1.0.tm.md sa,punk::path doc/files/punk/_module_path-0.1.0.tm.md punk::path(0) doc/files/punk/_module_path-0.1.0.tm.md shell {index.md shell} kw,repl {index.md repl} sa,punk::mix::commandset::project doc/files/punk/mix/commandset/_module_project-0.1.0.tm.md sa,punk::mix::commandset::project(0) doc/files/punk/mix/commandset/_module_project-0.1.0.tm.md {punkshell - Core} doc/files/main.md {pmix commandset - project} doc/files/punk/mix/commandset/_module_project-0.1.0.tm.md sa,punkshell(n) doc/files/main.md punk::cap doc/files/punk/_module_cap-0.1.0.tm.md sa,punkshell doc/files/main.md kw,shell {index.md shell} punk {index.md punk} punk::cap(0) doc/files/punk/_module_cap-0.1.0.tm.md punk::path doc/files/punk/_module_path-0.1.0.tm.md |
kw,capability {index.md capability} punkshell_module_punk::path(0) doc/files/punk/_module_path-0.1.0.tm.md sa,punkshell_module_punk::mix::commandset::project(0) doc/files/punk/mix/commandset/_module_project-0.1.0.tm.md {punkshell Changes} doc/files/project_changes.md {Introduction to punkshell} doc/files/project_intro.md punkshell_module_punk::mix::commandset::project(0) doc/files/punk/mix/commandset/_module_project-0.1.0.tm.md sa,punkshell(n) doc/files/main.md filesystem {index.md filesystem} sa,punkshell doc/files/main.md kw,shell {index.md shell} sa,punkshell_module_punk::cap doc/files/punk/_module_cap-0.1.0.tm.md sa,punkshell_module_punk::cap(0) doc/files/punk/_module_cap-0.1.0.tm.md sa,punkshell__project_changes(n) doc/files/project_changes.md kw,path {index.md path} kw,module {index.md module} punkshell(n) doc/files/main.md kw,plugin {index.md plugin} punkshell doc/files/main.md punkshell_module_punk::cap doc/files/punk/_module_cap-0.1.0.tm.md changelog {index.md changelog} punkshell_module_punk::cap(0) doc/files/punk/_module_cap-0.1.0.tm.md punkshell__project_changes(n) doc/files/project_changes.md sa,punkshell__project_changes doc/files/project_changes.md path {index.md path} sa,punkshell_module_punk::path doc/files/punk/_module_path-0.1.0.tm.md punkshell__project_changes doc/files/project_changes.md kw,filesystem {index.md filesystem} sa,punkshell_module_punk::mix::commandset::project doc/files/punk/mix/commandset/_module_project-0.1.0.tm.md shell {index.md shell} punkshell_module_punk::path doc/files/punk/_module_path-0.1.0.tm.md kw,repl {index.md repl} capability {index.md capability} punkshell_module_punk::mix::commandset::project doc/files/punk/mix/commandset/_module_project-0.1.0.tm.md {punkshell - Core} doc/files/main.md {pmix commandset - project} doc/files/punk/mix/commandset/_module_project-0.1.0.tm.md {capability provider and handler plugin system} doc/files/punk/_module_cap-0.1.0.tm.md repl {index.md repl} kw,punk {index.md punk} sa,punkshell__project_intro(n) doc/files/project_intro.md sa,punkshell__project_intro doc/files/project_intro.md {Filesystem path utilities} doc/files/punk/_module_path-0.1.0.tm.md sa,punkshell_module_punk::path(0) doc/files/punk/_module_path-0.1.0.tm.md punkshell__project_intro(n) doc/files/project_intro.md punkshell__project_intro doc/files/project_intro.md kw,changelog {index.md changelog} punk {index.md punk} module {index.md module} plugin {index.md plugin} |
@ -0,0 +1,75 @@ |
|||||||
|
|
||||||
|
[//000000001]: # (punkshell\_\_project\_changes \- punkshell \- a Tcl project) |
||||||
|
[//000000002]: # (Generated from file 'project\_changes\.man' by tcllib/doctools with format 'markdown') |
||||||
|
[//000000003]: # (punkshell\_\_project\_changes\(n\) 8 doc "punkshell \- a Tcl project") |
||||||
|
|
||||||
|
<hr> [ <a href="../../toc.md">Main Table Of Contents</a> | <a |
||||||
|
href="../toc.md">Table Of Contents</a> | <a |
||||||
|
href="../../index.md">Keyword Index</a> ] <hr> |
||||||
|
|
||||||
|
# NAME |
||||||
|
|
||||||
|
punkshell\_\_project\_changes \- punkshell Changes |
||||||
|
|
||||||
|
# <a name='toc'></a>Table Of Contents |
||||||
|
|
||||||
|
- [Table Of Contents](#toc) |
||||||
|
|
||||||
|
- [Synopsis](#synopsis) |
||||||
|
|
||||||
|
- [Description](#section1) |
||||||
|
|
||||||
|
- [Changes](#section2) |
||||||
|
|
||||||
|
- [Changes for version 0\.1](#subsection1) |
||||||
|
|
||||||
|
- [Bugs, Ideas, Feedback](#section3) |
||||||
|
|
||||||
|
- [Keywords](#keywords) |
||||||
|
|
||||||
|
- [Category](#category) |
||||||
|
|
||||||
|
# <a name='synopsis'></a>SYNOPSIS |
||||||
|
|
||||||
|
package require Tcl 8\.6 |
||||||
|
|
||||||
|
# <a name='description'></a>DESCRIPTION |
||||||
|
|
||||||
|
Welcome to the punkshell project\. |
||||||
|
|
||||||
|
This document provides an overview of the changes |
||||||
|
__[punkshell](main\.md)__ underwent from version to version\. |
||||||
|
|
||||||
|
# <a name='section2'></a>Changes |
||||||
|
|
||||||
|
## <a name='subsection1'></a>Changes for version 0\.1 |
||||||
|
|
||||||
|
This release 0\.1 of project punkshell |
||||||
|
|
||||||
|
Summary |
||||||
|
|
||||||
|
1. feature 1 |
||||||
|
|
||||||
|
1. feature 2 |
||||||
|
|
||||||
|
In detail: |
||||||
|
|
||||||
|
1. punkshell requires Tcl 8\.6 or higher\. Tcl 8\.5 or less is not supported\. |
||||||
|
|
||||||
|
# <a name='section3'></a>Bugs, Ideas, Feedback |
||||||
|
|
||||||
|
This document, and the package it describes, will undoubtedly contain bugs and |
||||||
|
other problems\. Please report such at the [punkshell |
||||||
|
tracker](https://gitea1\.intx\.com\.au/jn/punkshell/issues)\. Please also report |
||||||
|
any ideas for enhancements you may have for either package and/or documentation\. |
||||||
|
Contact: |
||||||
|
[julian\+punkshell@precisium\.com\.au](mailto:julian\+punkshell@precisium\.com\.au) |
||||||
|
|
||||||
|
# <a name='keywords'></a>KEYWORDS |
||||||
|
|
||||||
|
[changelog](\.\./\.\./index\.md\#changelog), [punk](\.\./\.\./index\.md\#punk), |
||||||
|
[repl](\.\./\.\./index\.md\#repl), [shell](\.\./\.\./index\.md\#shell) |
||||||
|
|
||||||
|
# <a name='category'></a>CATEGORY |
||||||
|
|
||||||
|
changelog |
@ -0,0 +1,57 @@ |
|||||||
|
|
||||||
|
[//000000001]: # (punkshell\_\_project\_intro \- punkshell \- a Tcl project) |
||||||
|
[//000000002]: # (Generated from file 'project\_intro\.man' by tcllib/doctools with format 'markdown') |
||||||
|
[//000000003]: # (punkshell\_\_project\_intro\(n\) 8 doc "punkshell \- a Tcl project") |
||||||
|
|
||||||
|
<hr> [ <a href="../../toc.md">Main Table Of Contents</a> | <a |
||||||
|
href="../toc.md">Table Of Contents</a> | <a |
||||||
|
href="../../index.md">Keyword Index</a> ] <hr> |
||||||
|
|
||||||
|
# NAME |
||||||
|
|
||||||
|
punkshell\_\_project\_intro \- Introduction to punkshell |
||||||
|
|
||||||
|
# <a name='toc'></a>Table Of Contents |
||||||
|
|
||||||
|
- [Table Of Contents](#toc) |
||||||
|
|
||||||
|
- [Synopsis](#synopsis) |
||||||
|
|
||||||
|
- [Description](#section1) |
||||||
|
|
||||||
|
- [Bugs, Ideas, Feedback](#section2) |
||||||
|
|
||||||
|
- [Keywords](#keywords) |
||||||
|
|
||||||
|
- [Category](#category) |
||||||
|
|
||||||
|
# <a name='synopsis'></a>SYNOPSIS |
||||||
|
|
||||||
|
package require Tcl 8\.6 |
||||||
|
|
||||||
|
# <a name='description'></a>DESCRIPTION |
||||||
|
|
||||||
|
Welcome to the punkshell project\. |
||||||
|
|
||||||
|
Introduction to punkshell |
||||||
|
|
||||||
|
# <a name='section2'></a>Bugs, Ideas, Feedback |
||||||
|
|
||||||
|
This document, and the package it describes, will undoubtedly contain bugs and |
||||||
|
other problems\. Please report such at the [punkshell |
||||||
|
tracker](https://gitea1\.intx\.com\.au/jn/punkshell/issues)\. Please also report |
||||||
|
any ideas for enhancements you may have for either package and/or documentation\. |
||||||
|
Contact: |
||||||
|
[julian\+punkshell@precisium\.com\.au](mailto:julian\+punkshell@precisium\.com\.au) |
||||||
|
|
||||||
|
This project uses [PunkShell](https://www\.gitea1\.intx\.com\.au/jn/punkshell) |
||||||
|
as a deployment management and documentation tool\. |
||||||
|
|
||||||
|
# <a name='keywords'></a>KEYWORDS |
||||||
|
|
||||||
|
[punk](\.\./\.\./index\.md\#punk), [repl](\.\./\.\./index\.md\#repl), |
||||||
|
[shell](\.\./\.\./index\.md\#shell) |
||||||
|
|
||||||
|
# <a name='category'></a>CATEGORY |
||||||
|
|
||||||
|
shell |
@ -1,6 +1,8 @@ |
|||||||
[toc_begin {Table Of Contents} doc] |
[toc_begin {Table Of Contents} doc] |
||||||
[item doc/files/punk/_module_cap-0.1.0.tm.html punk::cap {capability provider and handler plugin system}] |
|
||||||
[item doc/files/punk/mix/commandset/_module_project-0.1.0.tm.html punk::mix::commandset::project {pmix commandset - project}] |
|
||||||
[item doc/files/punk/_module_path-0.1.0.tm.html punk::path {Filesystem path utilities}] |
|
||||||
[item doc/files/main.html punkshell {punkshell - Core}] |
[item doc/files/main.html punkshell {punkshell - Core}] |
||||||
|
[item doc/files/project_changes.html punkshell__project_changes {punkshell Changes}] |
||||||
|
[item doc/files/project_intro.html punkshell__project_intro {Introduction to punkshell}] |
||||||
|
[item doc/files/punk/_module_cap-0.1.0.tm.html punkshell_module_punk::cap {capability provider and handler plugin system}] |
||||||
|
[item doc/files/punk/mix/commandset/_module_project-0.1.0.tm.html punkshell_module_punk::mix::commandset::project {pmix commandset - project}] |
||||||
|
[item doc/files/punk/_module_path-0.1.0.tm.html punkshell_module_punk::path {Filesystem path utilities}] |
||||||
[toc_end] |
[toc_end] |
||||||
|
@ -1 +1 @@ |
|||||||
{shell {{doc/files/main.html punkshell}} punk {{doc/files/main.html punkshell}} repl {{doc/files/main.html punkshell}}} {{repl doc/files/main.html punkshell} . {shell doc/files/main.html punkshell} . {punk doc/files/main.html punkshell} .} 3 {shell shell punk punk repl repl} |
{shell {{doc/files/project_intro.html punkshell__project_intro} {doc/files/project_changes.html punkshell__project_changes} {doc/files/main.html punkshell}} changelog {{doc/files/project_changes.html punkshell__project_changes}} filesystem {{doc/files/punk/_module_path-0.1.0.tm.html punkshell_module_punk::path}} path {{doc/files/punk/_module_path-0.1.0.tm.html punkshell_module_punk::path}} capability {{doc/files/punk/_module_cap-0.1.0.tm.html punkshell_module_punk::cap}} module {{doc/files/punk/_module_cap-0.1.0.tm.html punkshell_module_punk::cap} {doc/files/punk/_module_path-0.1.0.tm.html punkshell_module_punk::path}} punk {{doc/files/project_intro.html punkshell__project_intro} {doc/files/project_changes.html punkshell__project_changes} {doc/files/main.html punkshell}} plugin {{doc/files/punk/_module_cap-0.1.0.tm.html punkshell_module_punk::cap}} repl {{doc/files/project_intro.html punkshell__project_intro} {doc/files/project_changes.html punkshell__project_changes} {doc/files/main.html punkshell}}} {{repl doc/files/main.html punkshell} . {punk doc/files/project_intro.html punkshell__project_intro} . {capability doc/files/punk/_module_cap-0.1.0.tm.html punkshell_module_punk::cap} . {changelog doc/files/project_changes.html punkshell__project_changes} . {shell doc/files/project_changes.html punkshell__project_changes} . {shell doc/files/main.html punkshell} . {repl doc/files/project_intro.html punkshell__project_intro} . {module doc/files/punk/_module_cap-0.1.0.tm.html punkshell_module_punk::cap} . {plugin doc/files/punk/_module_cap-0.1.0.tm.html punkshell_module_punk::cap} . {filesystem doc/files/punk/_module_path-0.1.0.tm.html punkshell_module_punk::path} . {path doc/files/punk/_module_path-0.1.0.tm.html punkshell_module_punk::path} . {module doc/files/punk/_module_path-0.1.0.tm.html punkshell_module_punk::path} . {punk doc/files/project_changes.html punkshell__project_changes} . {shell doc/files/project_intro.html punkshell__project_intro} . {punk doc/files/main.html punkshell} . {repl doc/files/project_changes.html punkshell__project_changes} .} 9 {shell shell changelog changelog filesystem filesystem path path capability capability module module punk punk plugin plugin repl repl} |
@ -1 +1 @@ |
|||||||
doc {doc/toc {{doc/files/punk/_module_cap-0.1.0.tm.html punk::cap {capability provider and handler plugin system}} {doc/files/punk/_module_path-0.1.0.tm.html punk::path {Filesystem path utilities}} {doc/files/punk/mix/commandset/_module_project-0.1.0.tm.html punk::mix::commandset::project {pmix commandset - project}} {doc/files/main.html punkshell {punkshell - Core}}}} |
doc {doc/toc {{doc/files/punk/_module_cap-0.1.0.tm.html punkshell_module_punk::cap {capability provider and handler plugin system}} {doc/files/project_intro.html punkshell__project_intro {Introduction to punkshell}} {doc/files/punk/_module_path-0.1.0.tm.html punkshell_module_punk::path {Filesystem path utilities}} {doc/files/project_changes.html punkshell__project_changes {punkshell Changes}} {doc/files/punk/mix/commandset/_module_project-0.1.0.tm.html punkshell_module_punk::mix::commandset::project {pmix commandset - project}} {doc/files/main.html punkshell {punkshell - Core}}}} |
@ -1 +1 @@ |
|||||||
sa,punk::path(0) doc/files/punk/_module_path-0.1.0.tm.html {capability provider and handler plugin system} doc/files/punk/_module_cap-0.1.0.tm.html punk::mix::commandset::project doc/files/punk/mix/commandset/_module_project-0.1.0.tm.html punk::mix::commandset::project(0) doc/files/punk/mix/commandset/_module_project-0.1.0.tm.html repl {index.html repl} kw,punk {index.html punk} punkshell(n) doc/files/main.html sa,punk::cap doc/files/punk/_module_cap-0.1.0.tm.html {Filesystem path utilities} doc/files/punk/_module_path-0.1.0.tm.html punkshell doc/files/main.html sa,punk::cap(0) doc/files/punk/_module_cap-0.1.0.tm.html sa,punk::path doc/files/punk/_module_path-0.1.0.tm.html punk::path(0) doc/files/punk/_module_path-0.1.0.tm.html shell {index.html shell} kw,repl {index.html repl} sa,punk::mix::commandset::project doc/files/punk/mix/commandset/_module_project-0.1.0.tm.html sa,punk::mix::commandset::project(0) doc/files/punk/mix/commandset/_module_project-0.1.0.tm.html {punkshell - Core} doc/files/main.html {pmix commandset - project} doc/files/punk/mix/commandset/_module_project-0.1.0.tm.html sa,punkshell(n) doc/files/main.html punk::cap doc/files/punk/_module_cap-0.1.0.tm.html sa,punkshell doc/files/main.html kw,shell {index.html shell} punk {index.html punk} punk::cap(0) doc/files/punk/_module_cap-0.1.0.tm.html punk::path doc/files/punk/_module_path-0.1.0.tm.html |
kw,capability {index.html capability} punkshell_module_punk::path(0) doc/files/punk/_module_path-0.1.0.tm.html sa,punkshell_module_punk::mix::commandset::project(0) doc/files/punk/mix/commandset/_module_project-0.1.0.tm.html {punkshell Changes} doc/files/project_changes.html {Introduction to punkshell} doc/files/project_intro.html punkshell_module_punk::mix::commandset::project(0) doc/files/punk/mix/commandset/_module_project-0.1.0.tm.html sa,punkshell(n) doc/files/main.html filesystem {index.html filesystem} sa,punkshell doc/files/main.html kw,shell {index.html shell} sa,punkshell_module_punk::cap doc/files/punk/_module_cap-0.1.0.tm.html sa,punkshell_module_punk::cap(0) doc/files/punk/_module_cap-0.1.0.tm.html sa,punkshell__project_changes(n) doc/files/project_changes.html kw,path {index.html path} kw,module {index.html module} punkshell(n) doc/files/main.html kw,plugin {index.html plugin} punkshell doc/files/main.html punkshell_module_punk::cap doc/files/punk/_module_cap-0.1.0.tm.html changelog {index.html changelog} punkshell_module_punk::cap(0) doc/files/punk/_module_cap-0.1.0.tm.html punkshell__project_changes(n) doc/files/project_changes.html sa,punkshell__project_changes doc/files/project_changes.html path {index.html path} sa,punkshell_module_punk::path doc/files/punk/_module_path-0.1.0.tm.html punkshell__project_changes doc/files/project_changes.html kw,filesystem {index.html filesystem} sa,punkshell_module_punk::mix::commandset::project doc/files/punk/mix/commandset/_module_project-0.1.0.tm.html shell {index.html shell} punkshell_module_punk::path doc/files/punk/_module_path-0.1.0.tm.html kw,repl {index.html repl} capability {index.html capability} punkshell_module_punk::mix::commandset::project doc/files/punk/mix/commandset/_module_project-0.1.0.tm.html {punkshell - Core} doc/files/main.html {pmix commandset - project} doc/files/punk/mix/commandset/_module_project-0.1.0.tm.html {capability provider and handler plugin system} doc/files/punk/_module_cap-0.1.0.tm.html repl {index.html repl} kw,punk {index.html punk} sa,punkshell__project_intro(n) doc/files/project_intro.html sa,punkshell__project_intro doc/files/project_intro.html {Filesystem path utilities} doc/files/punk/_module_path-0.1.0.tm.html sa,punkshell_module_punk::path(0) doc/files/punk/_module_path-0.1.0.tm.html punkshell__project_intro(n) doc/files/project_intro.html punkshell__project_intro doc/files/project_intro.html kw,changelog {index.html changelog} punk {index.html punk} module {index.html module} plugin {index.html plugin} |
@ -0,0 +1,169 @@ |
|||||||
|
<!DOCTYPE html><html><head> |
||||||
|
<title>punkshell__project_changes - punkshell - a Tcl project</title> |
||||||
|
<style type="text/css"><!-- |
||||||
|
HTML { |
||||||
|
background: #FFFFFF; |
||||||
|
color: black; |
||||||
|
} |
||||||
|
BODY { |
||||||
|
background: #FFFFFF; |
||||||
|
color: black; |
||||||
|
} |
||||||
|
DIV.doctools { |
||||||
|
margin-left: 10%; |
||||||
|
margin-right: 10%; |
||||||
|
} |
||||||
|
DIV.doctools H1,DIV.doctools H2 { |
||||||
|
margin-left: -5%; |
||||||
|
} |
||||||
|
H1, H2, H3, H4 { |
||||||
|
margin-top: 1em; |
||||||
|
font-family: sans-serif; |
||||||
|
font-size: large; |
||||||
|
color: #005A9C; |
||||||
|
background: transparent; |
||||||
|
text-align: left; |
||||||
|
} |
||||||
|
H1.doctools_title { |
||||||
|
text-align: center; |
||||||
|
} |
||||||
|
UL,OL { |
||||||
|
margin-right: 0em; |
||||||
|
margin-top: 3pt; |
||||||
|
margin-bottom: 3pt; |
||||||
|
} |
||||||
|
UL LI { |
||||||
|
list-style: disc; |
||||||
|
} |
||||||
|
OL LI { |
||||||
|
list-style: decimal; |
||||||
|
} |
||||||
|
DT { |
||||||
|
padding-top: 1ex; |
||||||
|
} |
||||||
|
UL.doctools_toc,UL.doctools_toc UL, UL.doctools_toc UL UL { |
||||||
|
font: normal 12pt/14pt sans-serif; |
||||||
|
list-style: none; |
||||||
|
} |
||||||
|
LI.doctools_section, LI.doctools_subsection { |
||||||
|
list-style: none; |
||||||
|
margin-left: 0em; |
||||||
|
text-indent: 0em; |
||||||
|
padding: 0em; |
||||||
|
} |
||||||
|
PRE { |
||||||
|
display: block; |
||||||
|
font-family: monospace; |
||||||
|
white-space: pre; |
||||||
|
margin: 0%; |
||||||
|
padding-top: 0.5ex; |
||||||
|
padding-bottom: 0.5ex; |
||||||
|
padding-left: 1ex; |
||||||
|
padding-right: 1ex; |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
PRE.doctools_example { |
||||||
|
color: black; |
||||||
|
background: #f5dcb3; |
||||||
|
border: 1px solid black; |
||||||
|
} |
||||||
|
UL.doctools_requirements LI, UL.doctools_syntax LI { |
||||||
|
list-style: none; |
||||||
|
margin-left: 0em; |
||||||
|
text-indent: 0em; |
||||||
|
padding: 0em; |
||||||
|
} |
||||||
|
DIV.doctools_synopsis { |
||||||
|
color: black; |
||||||
|
background: #80ffff; |
||||||
|
border: 1px solid black; |
||||||
|
font-family: serif; |
||||||
|
margin-top: 1em; |
||||||
|
margin-bottom: 1em; |
||||||
|
} |
||||||
|
UL.doctools_syntax { |
||||||
|
margin-top: 1em; |
||||||
|
border-top: 1px solid black; |
||||||
|
} |
||||||
|
UL.doctools_requirements { |
||||||
|
margin-bottom: 1em; |
||||||
|
border-bottom: 1px solid black; |
||||||
|
} |
||||||
|
--></style> |
||||||
|
</head> |
||||||
|
<!-- Generated from file 'project_changes.man' by tcllib/doctools with format 'html' |
||||||
|
--> |
||||||
|
<!-- punkshell__project_changes.n |
||||||
|
--> |
||||||
|
<body><hr> [ |
||||||
|
<a href="../../toc.html">Main Table Of Contents</a> |
||||||
|
| <a href="../toc.html">Table Of Contents</a> |
||||||
|
| <a href="../../index.html">Keyword Index</a> |
||||||
|
] <hr> |
||||||
|
<div class="doctools"> |
||||||
|
<h1 class="doctools_title">punkshell__project_changes(n) 8 doc "punkshell - a Tcl project"</h1> |
||||||
|
<div id="name" class="doctools_section"><h2><a name="name">Name</a></h2> |
||||||
|
<p>punkshell__project_changes - punkshell Changes</p> |
||||||
|
</div> |
||||||
|
<div id="toc" class="doctools_section"><h2><a name="toc">Table Of Contents</a></h2> |
||||||
|
<ul class="doctools_toc"> |
||||||
|
<li class="doctools_section"><a href="#toc">Table Of Contents</a></li> |
||||||
|
<li class="doctools_section"><a href="#synopsis">Synopsis</a></li> |
||||||
|
<li class="doctools_section"><a href="#section1">Description</a></li> |
||||||
|
<li class="doctools_section"><a href="#section2">Changes</a> |
||||||
|
<ul> |
||||||
|
<li class="doctools_subsection"><a href="#subsection1">Changes for version 0.1</a></li> |
||||||
|
</ul> |
||||||
|
</li> |
||||||
|
<li class="doctools_section"><a href="#section3">Bugs, Ideas, Feedback</a></li> |
||||||
|
<li class="doctools_section"><a href="#keywords">Keywords</a></li> |
||||||
|
<li class="doctools_section"><a href="#category">Category</a></li> |
||||||
|
</ul> |
||||||
|
</div> |
||||||
|
<div id="synopsis" class="doctools_section"><h2><a name="synopsis">Synopsis</a></h2> |
||||||
|
<div class="doctools_synopsis"> |
||||||
|
<ul class="doctools_requirements"> |
||||||
|
<li>package require <b class="pkgname">Tcl 8.6</b></li> |
||||||
|
</ul> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div id="section1" class="doctools_section"><h2><a name="section1">Description</a></h2> |
||||||
|
<p>Welcome to the punkshell project.</p> |
||||||
|
<p>This document provides an overview of the changes <b class="package"><a href="main.html">punkshell</a></b> |
||||||
|
underwent from version to version.</p> |
||||||
|
</div> |
||||||
|
<div id="section2" class="doctools_section"><h2><a name="section2">Changes</a></h2> |
||||||
|
<div id="subsection1" class="doctools_subsection"><h3><a name="subsection1">Changes for version 0.1</a></h3> |
||||||
|
<p>This release 0.1 of project punkshell</p> |
||||||
|
<p>Summary</p> |
||||||
|
<ol class="doctools_enumerated"> |
||||||
|
|
||||||
|
<li><p>feature 1</p></li> |
||||||
|
<li><p>feature 2</p></li> |
||||||
|
</ol> |
||||||
|
<p>In detail:</p> |
||||||
|
<ol class="doctools_enumerated"> |
||||||
|
|
||||||
|
|
||||||
|
<li><p>punkshell requires Tcl 8.6 or higher. Tcl 8.5 or less is not |
||||||
|
supported.</p></li> |
||||||
|
<li></li> |
||||||
|
</ol> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div id="section3" class="doctools_section"><h2><a name="section3">Bugs, Ideas, Feedback</a></h2> |
||||||
|
<p>This document, and the package it describes, will undoubtedly contain |
||||||
|
bugs and other problems. |
||||||
|
Please report such at the |
||||||
|
<a href="https://gitea1.intx.com.au/jn/punkshell/issues">punkshell tracker</a>. |
||||||
|
Please also report any ideas for enhancements you may have for either |
||||||
|
package and/or documentation. |
||||||
|
Contact: <a href="mailto:julian+punkshell@precisium.com.au">julian+punkshell@precisium.com.au</a></p> |
||||||
|
</div> |
||||||
|
<div id="keywords" class="doctools_section"><h2><a name="keywords">Keywords</a></h2> |
||||||
|
<p><a href="../../index.html#changelog">changelog</a>, <a href="../../index.html#punk">punk</a>, <a href="../../index.html#repl">repl</a>, <a href="../../index.html#shell">shell</a></p> |
||||||
|
</div> |
||||||
|
<div id="category" class="doctools_section"><h2><a name="category">Category</a></h2> |
||||||
|
<p>changelog</p> |
||||||
|
</div> |
||||||
|
</div></body></html> |
@ -0,0 +1,145 @@ |
|||||||
|
<!DOCTYPE html><html><head> |
||||||
|
<title>punkshell__project_intro - punkshell - a Tcl project</title> |
||||||
|
<style type="text/css"><!-- |
||||||
|
HTML { |
||||||
|
background: #FFFFFF; |
||||||
|
color: black; |
||||||
|
} |
||||||
|
BODY { |
||||||
|
background: #FFFFFF; |
||||||
|
color: black; |
||||||
|
} |
||||||
|
DIV.doctools { |
||||||
|
margin-left: 10%; |
||||||
|
margin-right: 10%; |
||||||
|
} |
||||||
|
DIV.doctools H1,DIV.doctools H2 { |
||||||
|
margin-left: -5%; |
||||||
|
} |
||||||
|
H1, H2, H3, H4 { |
||||||
|
margin-top: 1em; |
||||||
|
font-family: sans-serif; |
||||||
|
font-size: large; |
||||||
|
color: #005A9C; |
||||||
|
background: transparent; |
||||||
|
text-align: left; |
||||||
|
} |
||||||
|
H1.doctools_title { |
||||||
|
text-align: center; |
||||||
|
} |
||||||
|
UL,OL { |
||||||
|
margin-right: 0em; |
||||||
|
margin-top: 3pt; |
||||||
|
margin-bottom: 3pt; |
||||||
|
} |
||||||
|
UL LI { |
||||||
|
list-style: disc; |
||||||
|
} |
||||||
|
OL LI { |
||||||
|
list-style: decimal; |
||||||
|
} |
||||||
|
DT { |
||||||
|
padding-top: 1ex; |
||||||
|
} |
||||||
|
UL.doctools_toc,UL.doctools_toc UL, UL.doctools_toc UL UL { |
||||||
|
font: normal 12pt/14pt sans-serif; |
||||||
|
list-style: none; |
||||||
|
} |
||||||
|
LI.doctools_section, LI.doctools_subsection { |
||||||
|
list-style: none; |
||||||
|
margin-left: 0em; |
||||||
|
text-indent: 0em; |
||||||
|
padding: 0em; |
||||||
|
} |
||||||
|
PRE { |
||||||
|
display: block; |
||||||
|
font-family: monospace; |
||||||
|
white-space: pre; |
||||||
|
margin: 0%; |
||||||
|
padding-top: 0.5ex; |
||||||
|
padding-bottom: 0.5ex; |
||||||
|
padding-left: 1ex; |
||||||
|
padding-right: 1ex; |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
PRE.doctools_example { |
||||||
|
color: black; |
||||||
|
background: #f5dcb3; |
||||||
|
border: 1px solid black; |
||||||
|
} |
||||||
|
UL.doctools_requirements LI, UL.doctools_syntax LI { |
||||||
|
list-style: none; |
||||||
|
margin-left: 0em; |
||||||
|
text-indent: 0em; |
||||||
|
padding: 0em; |
||||||
|
} |
||||||
|
DIV.doctools_synopsis { |
||||||
|
color: black; |
||||||
|
background: #80ffff; |
||||||
|
border: 1px solid black; |
||||||
|
font-family: serif; |
||||||
|
margin-top: 1em; |
||||||
|
margin-bottom: 1em; |
||||||
|
} |
||||||
|
UL.doctools_syntax { |
||||||
|
margin-top: 1em; |
||||||
|
border-top: 1px solid black; |
||||||
|
} |
||||||
|
UL.doctools_requirements { |
||||||
|
margin-bottom: 1em; |
||||||
|
border-bottom: 1px solid black; |
||||||
|
} |
||||||
|
--></style> |
||||||
|
</head> |
||||||
|
<!-- Generated from file 'project_intro.man' by tcllib/doctools with format 'html' |
||||||
|
--> |
||||||
|
<!-- punkshell__project_intro.n |
||||||
|
--> |
||||||
|
<body><hr> [ |
||||||
|
<a href="../../toc.html">Main Table Of Contents</a> |
||||||
|
| <a href="../toc.html">Table Of Contents</a> |
||||||
|
| <a href="../../index.html">Keyword Index</a> |
||||||
|
] <hr> |
||||||
|
<div class="doctools"> |
||||||
|
<h1 class="doctools_title">punkshell__project_intro(n) 8 doc "punkshell - a Tcl project"</h1> |
||||||
|
<div id="name" class="doctools_section"><h2><a name="name">Name</a></h2> |
||||||
|
<p>punkshell__project_intro - Introduction to punkshell</p> |
||||||
|
</div> |
||||||
|
<div id="toc" class="doctools_section"><h2><a name="toc">Table Of Contents</a></h2> |
||||||
|
<ul class="doctools_toc"> |
||||||
|
<li class="doctools_section"><a href="#toc">Table Of Contents</a></li> |
||||||
|
<li class="doctools_section"><a href="#synopsis">Synopsis</a></li> |
||||||
|
<li class="doctools_section"><a href="#section1">Description</a></li> |
||||||
|
<li class="doctools_section"><a href="#section2">Bugs, Ideas, Feedback</a></li> |
||||||
|
<li class="doctools_section"><a href="#keywords">Keywords</a></li> |
||||||
|
<li class="doctools_section"><a href="#category">Category</a></li> |
||||||
|
</ul> |
||||||
|
</div> |
||||||
|
<div id="synopsis" class="doctools_section"><h2><a name="synopsis">Synopsis</a></h2> |
||||||
|
<div class="doctools_synopsis"> |
||||||
|
<ul class="doctools_requirements"> |
||||||
|
<li>package require <b class="pkgname">Tcl 8.6</b></li> |
||||||
|
</ul> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div id="section1" class="doctools_section"><h2><a name="section1">Description</a></h2> |
||||||
|
<p>Welcome to the punkshell project.</p> |
||||||
|
<p>Introduction to punkshell</p> |
||||||
|
</div> |
||||||
|
<div id="section2" class="doctools_section"><h2><a name="section2">Bugs, Ideas, Feedback</a></h2> |
||||||
|
<p>This document, and the package it describes, will undoubtedly contain |
||||||
|
bugs and other problems. |
||||||
|
Please report such at the |
||||||
|
<a href="https://gitea1.intx.com.au/jn/punkshell/issues">punkshell tracker</a>. |
||||||
|
Please also report any ideas for enhancements you may have for either |
||||||
|
package and/or documentation. |
||||||
|
Contact: <a href="mailto:julian+punkshell@precisium.com.au">julian+punkshell@precisium.com.au</a></p> |
||||||
|
<p>This project uses <a href="https://www.gitea1.intx.com.au/jn/punkshell">PunkShell</a> as a deployment management and documentation tool.</p> |
||||||
|
</div> |
||||||
|
<div id="keywords" class="doctools_section"><h2><a name="keywords">Keywords</a></h2> |
||||||
|
<p><a href="../../index.html#punk">punk</a>, <a href="../../index.html#repl">repl</a>, <a href="../../index.html#shell">shell</a></p> |
||||||
|
</div> |
||||||
|
<div id="category" class="doctools_section"><h2><a name="category">Category</a></h2> |
||||||
|
<p>shell</p> |
||||||
|
</div> |
||||||
|
</div></body></html> |
@ -0,0 +1,71 @@ |
|||||||
|
|
||||||
|
# -*- 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. |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
# (C) 2023 |
||||||
|
# |
||||||
|
# @@ Meta Begin |
||||||
|
# Application punk::docgen 0.1.0 |
||||||
|
# Meta platform tcl |
||||||
|
# Meta license BSD |
||||||
|
# @@ Meta End |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
## Requirements |
||||||
|
##e.g package require frobz |
||||||
|
|
||||||
|
package require punk::repo |
||||||
|
|
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
namespace eval punk::docgen { |
||||||
|
proc get_doctools_comments {fname} { |
||||||
|
#does no validation of doctools commands |
||||||
|
#existence of string match #\**!doctools is taken as evidence enough that the file has inline doctools - review |
||||||
|
if {![file exists $fname]} { |
||||||
|
error "get_doctools_comments file '$fname' not found" |
||||||
|
} |
||||||
|
set fd [open $fname r] |
||||||
|
set data [read $fd] |
||||||
|
close $fd |
||||||
|
if {![string match "*#\**!doctools*" $data]} { |
||||||
|
return |
||||||
|
} |
||||||
|
set data [string map [list \r\n \n] $data] |
||||||
|
set in_doctools 0 |
||||||
|
set doctools "" |
||||||
|
foreach ln [split $data \n] { |
||||||
|
set ln [string trim $ln] |
||||||
|
if {$in_doctools && [string index $ln 0] != "#"} { |
||||||
|
set in_doctools 0 |
||||||
|
} elseif {[string range $ln 0 1] == "#*"} { |
||||||
|
#todo - process doctools ordering hints in tail of line |
||||||
|
set in_doctools 1 |
||||||
|
} elseif {$in_doctools} { |
||||||
|
append doctools [string range $ln 1 end] \n |
||||||
|
} |
||||||
|
} |
||||||
|
return $doctools |
||||||
|
} |
||||||
|
#todo - proc autogen_doctools_comments {fname} {} |
||||||
|
# - will probably need to use something like parsetcl - as we won't be able to reliably source in an interp without side-effects and use info body etc. |
||||||
|
# - mechanism will be to autodocument namespaces, procs, methods where no #*** doctools indication present - but use existing doctools comments for that particular item if it is present. |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
## Ready |
||||||
|
package provide punk::docgen [namespace eval punk::docgen { |
||||||
|
variable pkg punk::docgen |
||||||
|
variable version |
||||||
|
set version 0.1.0 |
||||||
|
}] |
||||||
|
return |
@ -0,0 +1,397 @@ |
|||||||
|
# -*- 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. |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
# (C) 2023 |
||||||
|
# |
||||||
|
# @@ Meta Begin |
||||||
|
# Application punk::path 0.1.0 |
||||||
|
# Meta platform tcl |
||||||
|
# Meta license <unspecified> |
||||||
|
# @@ Meta End |
||||||
|
|
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
# doctools header |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
#*** !doctools |
||||||
|
#[manpage_begin punkshell_module_punk::path 0 0.1.0] |
||||||
|
#[copyright "2023"] |
||||||
|
#[titledesc {Filesystem path utilities}] [comment {-- Name section and table of contents description --}] |
||||||
|
#[moddesc {punk path filesystem utils}] [comment {-- Description at end of page heading --}] |
||||||
|
#[require punk::path] |
||||||
|
#[description] |
||||||
|
#[keywords module path filesystem] |
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
|
||||||
|
#*** !doctools |
||||||
|
#[section Overview] |
||||||
|
#[para] overview of punk::path |
||||||
|
#[para] Filesystem path utility functions |
||||||
|
#[subsection Concepts] |
||||||
|
#[para] - |
||||||
|
|
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
## Requirements |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
|
||||||
|
#*** !doctools |
||||||
|
#[subsection dependencies] |
||||||
|
#[para] packages used by punk::path |
||||||
|
#[list_begin itemized] |
||||||
|
|
||||||
|
package require Tcl 8.6 |
||||||
|
#*** !doctools |
||||||
|
#[item] [package {Tcl 8.6}] |
||||||
|
|
||||||
|
# #package require frobz |
||||||
|
# #*** !doctools |
||||||
|
# #[item] [package {frobz}] |
||||||
|
|
||||||
|
#*** !doctools |
||||||
|
#[list_end] |
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
|
||||||
|
#*** !doctools |
||||||
|
#[section API] |
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
# oo::class namespace |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
namespace eval punk::path::class { |
||||||
|
#*** !doctools |
||||||
|
#[subsection {Namespace punk::path::class}] |
||||||
|
#[para] class definitions |
||||||
|
if {[info commands [namespace current]::interface_sample1] eq ""} { |
||||||
|
#*** !doctools |
||||||
|
#[list_begin enumerated] |
||||||
|
|
||||||
|
# oo::class create interface_sample1 { |
||||||
|
# #*** !doctools |
||||||
|
# #[enum] CLASS [class interface_sample1] |
||||||
|
# #[list_begin definitions] |
||||||
|
|
||||||
|
# method test {arg1} { |
||||||
|
# #*** !doctools |
||||||
|
# #[call class::interface_sample1 [method test] [arg arg1]] |
||||||
|
# #[para] test method |
||||||
|
# puts "test: $arg1" |
||||||
|
# } |
||||||
|
|
||||||
|
# #*** !doctools |
||||||
|
# #[list_end] [comment {-- end definitions interface_sample1}] |
||||||
|
# } |
||||||
|
|
||||||
|
#*** !doctools |
||||||
|
#[list_end] [comment {--- end class enumeration ---}] |
||||||
|
} |
||||||
|
} |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
# Base namespace |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
namespace eval punk::path { |
||||||
|
namespace export * |
||||||
|
#variable xyz |
||||||
|
|
||||||
|
#*** !doctools |
||||||
|
#[subsection {Namespace punk::path}] |
||||||
|
#[para] Core API functions for punk::path |
||||||
|
#[list_begin definitions] |
||||||
|
|
||||||
|
|
||||||
|
proc pathglob_as_re {pathglob} { |
||||||
|
#*** !doctools |
||||||
|
#[call [fun pathglob_as_re] [arg pathglob]] |
||||||
|
#[para] Returns a regular expression for matching a path to a glob pattern which can contain glob chars *|? in any segment of the path structure |
||||||
|
#[para] ** matches any number of subdirectories. |
||||||
|
#[para] e.g /etc/**/*.txt will match any .txt files at any depth below /etc (except directly within /etc itself) |
||||||
|
#[para] e.g /etc/**.txt will match any .txt files at any depth below /etc |
||||||
|
#[para] any segment that does not contain ** must match exactly one segment in the path |
||||||
|
#[para] e.g the glob /etc/*/*.doc - will match any .doc files that are exactly one tree level below /etc |
||||||
|
#[para] The pathglob doesn't have to contain glob characters, in which case the returned regex will match the pathglob exactly as specified. |
||||||
|
#[para] Regular expression syntax is deliberateley not supported within the pathglob string so that supplied regex characters will be treated as literals |
||||||
|
|
||||||
|
|
||||||
|
#todo - consider whether a way to escape the glob chars ? * is practical - to allow literals ? * |
||||||
|
# - would require counting immediately-preceding backslashes |
||||||
|
set pats [list] |
||||||
|
foreach seg [file split $pathglob] { |
||||||
|
if {[string range $seg end end] eq "/"} { |
||||||
|
set seg [string range $seg 0 end-1] ;# e.g c:/ -> c: / -> "" so that join at end doesn't double up |
||||||
|
} |
||||||
|
if {$seg eq "*"} { |
||||||
|
lappend pats {[^/]*} |
||||||
|
} elseif {$seg eq "**"} { |
||||||
|
lappend pats {.*} |
||||||
|
} else { |
||||||
|
set seg [string map [list {^ {\^} $ {\$} [} {\[} ( {\(} \{ \\\{ \\ {\\}] $seg] ;#treat regex characters in the input as literals |
||||||
|
set seg [string map [list . {[.]}] $seg] |
||||||
|
if {[regexp {[*?]} $seg]} { |
||||||
|
set pat [string map [list ** {.*} * {[^/]*} ? {[^/]}] $seg] |
||||||
|
lappend pats "$pat" |
||||||
|
} else { |
||||||
|
lappend pats "$seg" |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return "^[join $pats /]\$" |
||||||
|
} |
||||||
|
proc globmatchpath {pathglob path args} { |
||||||
|
#*** !doctools |
||||||
|
#[call [fun globmatchpath] [arg pathglob] [arg path] [opt {option value...}]] |
||||||
|
#[para] Return true if the pathglob matches the path |
||||||
|
#[para] see [fun pathglob_as_re] for pathglob description |
||||||
|
#[para] Caller must ensure that file separator is forward slash. (e.g use file normalize on windows) |
||||||
|
#[para] |
||||||
|
#[para] Known options: |
||||||
|
#[para] -nocase 0|1 (default 0 - case sensitive) |
||||||
|
#[para] If -nocase is not supplied - default to case sensitive *except for driveletter* |
||||||
|
#[para] ie - the driveletter alone in paths such as c:/etc will still be case insensitive. (ie c:/ETC/* will match C:/ETC/blah but not C:/etc/blah) |
||||||
|
#[para] Explicitly specifying -nocase 0 will require the entire case to match including the driveletter. |
||||||
|
|
||||||
|
set defaults [dict create\ |
||||||
|
-nocase \uFFFF\ |
||||||
|
] |
||||||
|
set known_opts [dict keys $defaults] |
||||||
|
set opts [dict merge $defaults $args] |
||||||
|
dict for {k v} $args { |
||||||
|
if {$k ni $known_opts} { |
||||||
|
error "Unrecognised options $k - known options: $known_opts" |
||||||
|
} |
||||||
|
} |
||||||
|
# -- --- --- --- --- --- |
||||||
|
set opt_nocase [dict get $opts -nocase] |
||||||
|
set explicit_nocase 1 ;#default to disprove |
||||||
|
if {$opt_nocase eq "\uFFFF"} { |
||||||
|
set opt_nocase 0 |
||||||
|
set explicit_nocase 0 |
||||||
|
} |
||||||
|
# -- --- --- --- --- --- |
||||||
|
if {$opt_nocase} { |
||||||
|
return [regexp -nocase [pathglob_as_re $pathglob] $path] |
||||||
|
} else { |
||||||
|
set re [pathglob_as_re $pathglob] |
||||||
|
if {$explicit_nocase} { |
||||||
|
set ismatch [regexp $re $path] ;#explicit -nocase 0 - require exact match of path literals including driveletter |
||||||
|
} else { |
||||||
|
#caller is using default for -nocase - which indicates case sensitivity - but we have an exception for the driveletter. |
||||||
|
set re_segments [file split $re] ;#Note that file split c:/etc gives {c:/ etc} but file split ^c:/etc gives {^c: etc} |
||||||
|
set first_seg [lindex $re_segments 0] |
||||||
|
if {[regexp {^\^(.{1}):$} $first_seg _match driveletter]} { |
||||||
|
#first part of re is like "^c:" i.e a drive letter |
||||||
|
set chars [string tolower $driveletter][string toupper $driveletter] |
||||||
|
set re [join [concat "^\[$chars\]:" [lrange $re_segments 1 end]] /] ;#rebuild re with case insensitive driveletter only - use join - not file join. file join will misinterpret leading re segment. |
||||||
|
} |
||||||
|
#puts stderr "-->re: $re" |
||||||
|
set ismatch [regexp $re $path] |
||||||
|
} |
||||||
|
} |
||||||
|
return $ismatch |
||||||
|
} |
||||||
|
|
||||||
|
#todo - implement treefiles which acts like dirfiles but allows path globbing in the same way as punk::ns::ns/ |
||||||
|
#then review if treefiles can replace dirfiles or if both should exist (dirfiles can have literal glob chars in path segments - but that is a rare usecase) |
||||||
|
proc treefilenames {basepath tailglob args} { |
||||||
|
#*** !doctools |
||||||
|
#[call [fun treefilenames] [arg basepath] [arg tailglob] [opt {option value...}]] |
||||||
|
#basic (glob based) list of filenames matching tailglob - recursive |
||||||
|
#no natsorting - so order is dependent on filesystem |
||||||
|
set defaults [dict create\ |
||||||
|
-call-depth-internal 0\ |
||||||
|
-antiglob_paths {}\ |
||||||
|
] |
||||||
|
set opts [dict merge $defaults $args] |
||||||
|
set opt_antiglob_paths [dict get $opts -antiglob_paths] |
||||||
|
set CALLDEPTH [dict get $opts -call-depth-internal] |
||||||
|
|
||||||
|
set files [list] |
||||||
|
if {$CALLDEPTH == 0} { |
||||||
|
if {![file isdirectory $basepath]} { |
||||||
|
return [list] |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
set skip 0 |
||||||
|
foreach anti $opt_antiglob_paths { |
||||||
|
if {[globmatchpath $anti $basepath]} { |
||||||
|
set skip 1 |
||||||
|
break |
||||||
|
} |
||||||
|
} |
||||||
|
if {$skip} { |
||||||
|
return [list] |
||||||
|
} |
||||||
|
|
||||||
|
#todo - account for vfs where matched path could appear to be a directory but is mounted so could be a desired match? |
||||||
|
set dirfiles [glob -nocomplain -dir $basepath -type f $tailglob] |
||||||
|
lappend files {*}$dirfiles |
||||||
|
set dirdirs [glob -nocomplain -dir $basepath -type d *] |
||||||
|
foreach dir $dirdirs { |
||||||
|
set skip 0 |
||||||
|
foreach anti $opt_antiglob_paths { |
||||||
|
if {[globmatchpath $anti $dir]} { |
||||||
|
set skip 1 |
||||||
|
break |
||||||
|
} |
||||||
|
} |
||||||
|
if {$skip} { |
||||||
|
continue |
||||||
|
} |
||||||
|
set nextargs [dict merge $args [list -call-depth-internal [incr CALLDEPTH]]] |
||||||
|
lappend files {*}[treefilenames $dir $tailglob {*}$nextargs] |
||||||
|
} |
||||||
|
return $files |
||||||
|
} |
||||||
|
|
||||||
|
#maint warning - also in punkcheck |
||||||
|
proc relative {reference location} { |
||||||
|
#*** !doctools |
||||||
|
#[call [fun relative] [arg reference] [arg location]] |
||||||
|
#[para] Taking two directory paths, a reference and a location, computes the path |
||||||
|
# of the location relative to the reference. |
||||||
|
#[list_begin itemized] |
||||||
|
#[item] |
||||||
|
#[para] Arguments: |
||||||
|
# [list_begin arguments] |
||||||
|
# [arg_def string reference] The path from which the relative path to location is determined. |
||||||
|
# [arg_def string location] The location path which may be above or below the reference path |
||||||
|
# [list_end] |
||||||
|
#[item] |
||||||
|
#[para] Results: |
||||||
|
#[para] The relative path of the location to the reference path. |
||||||
|
#[para] Will return a single dot "." if the paths are the same |
||||||
|
#[item] |
||||||
|
#[para] Notes: |
||||||
|
#[para] Both paths must be the same type - ie both absolute or both relative |
||||||
|
#[para] Case sensitive. ie relative /etc /etC |
||||||
|
# will return ../etC |
||||||
|
#[para] On windows, the drive-letter component (only) is not case sensitive |
||||||
|
#[para] ie relative c:/etc C:/etc returns . |
||||||
|
#[para] but relative c:/etc C:/Etc returns ../Etc |
||||||
|
#[para] On windows, if the paths are absolute and specifiy different volumes, only the location will be returned. |
||||||
|
# ie relative c:/etc d:/etc/blah |
||||||
|
# returns d:/etc/blah |
||||||
|
#[list_end] |
||||||
|
|
||||||
|
#see also kettle |
||||||
|
# Modified copy of ::fileutil::relative (tcllib) |
||||||
|
# Adapted to 8.5 ({*}). |
||||||
|
|
||||||
|
#review - check volume info on windows.. UNC paths? |
||||||
|
if {[file pathtype $reference] ne [file pathtype $location]} { |
||||||
|
return -code error "Unable to compute relation for paths of different pathtypes: [file pathtype $reference] vs. [file pathtype $location], ($reference vs. $location)" |
||||||
|
} |
||||||
|
|
||||||
|
#avoid normalizing if possible (file normalize *very* expensive on windows) |
||||||
|
set do_normalize 0 |
||||||
|
if {[file pathtype $reference] eq "relative"} { |
||||||
|
#if reference is relative so is location |
||||||
|
if {[regexp {[.]{2}} [list $reference $location]]} { |
||||||
|
set do_normalize 1 |
||||||
|
} |
||||||
|
if {[regexp {[.]/} [list $reference $location]]} { |
||||||
|
set do_normalize 1 |
||||||
|
} |
||||||
|
} else { |
||||||
|
set do_normalize 1 |
||||||
|
} |
||||||
|
if {$do_normalize} { |
||||||
|
set reference [file normalize $reference] |
||||||
|
set location [file normalize $location] |
||||||
|
} |
||||||
|
|
||||||
|
set save $location |
||||||
|
set reference [file split $reference] |
||||||
|
set location [file split $location] |
||||||
|
|
||||||
|
while {[lindex $location 0] eq [lindex $reference 0]} { |
||||||
|
set location [lrange $location 1 end] |
||||||
|
set reference [lrange $reference 1 end] |
||||||
|
if {![llength $location]} {break} |
||||||
|
} |
||||||
|
|
||||||
|
set location_len [llength $location] |
||||||
|
set reference_len [llength $reference] |
||||||
|
|
||||||
|
if {($location_len == 0) && ($reference_len == 0)} { |
||||||
|
# Cases: |
||||||
|
# (a) reference == location |
||||||
|
|
||||||
|
set location . |
||||||
|
} else { |
||||||
|
# Cases: |
||||||
|
# (b) ref is: ref/sub = sub |
||||||
|
# loc is: ref = {} |
||||||
|
|
||||||
|
# (c) ref is: ref = {} |
||||||
|
# loc is: ref/sub = sub |
||||||
|
|
||||||
|
while {$reference_len > 0} { |
||||||
|
set location [linsert $location 0 ..] |
||||||
|
incr reference_len -1 |
||||||
|
} |
||||||
|
set location [file join {*}$location] |
||||||
|
} |
||||||
|
return $location |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#*** !doctools |
||||||
|
#[list_end] [comment {--- end definitions namespace punk::path ---}] |
||||||
|
} |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
|
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
# Secondary API namespace |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
namespace eval punk::path::lib { |
||||||
|
namespace export * |
||||||
|
namespace path [namespace parent] |
||||||
|
#*** !doctools |
||||||
|
#[subsection {Namespace punk::path::lib}] |
||||||
|
#[para] Secondary functions that are part of the API |
||||||
|
#[list_begin definitions] |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#*** !doctools |
||||||
|
#[list_end] [comment {--- end definitions namespace punk::path::lib ---}] |
||||||
|
} |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
#*** !doctools |
||||||
|
#[section Internal] |
||||||
|
namespace eval punk::path::system { |
||||||
|
#*** !doctools |
||||||
|
#[subsection {Namespace punk::path::system}] |
||||||
|
#[para] Internal functions that are not part of the API |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
## Ready |
||||||
|
package provide punk::path [namespace eval punk::path { |
||||||
|
variable pkg punk::path |
||||||
|
variable version |
||||||
|
set version 0.1.0 |
||||||
|
}] |
||||||
|
return |
||||||
|
|
||||||
|
#*** !doctools |
||||||
|
#[manpage_end] |
||||||
|
|
@ -0,0 +1,71 @@ |
|||||||
|
|
||||||
|
# -*- 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. |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
# (C) 2023 |
||||||
|
# |
||||||
|
# @@ Meta Begin |
||||||
|
# Application punk::docgen 0.1.0 |
||||||
|
# Meta platform tcl |
||||||
|
# Meta license BSD |
||||||
|
# @@ Meta End |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
## Requirements |
||||||
|
##e.g package require frobz |
||||||
|
|
||||||
|
package require punk::repo |
||||||
|
|
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
namespace eval punk::docgen { |
||||||
|
proc get_doctools_comments {fname} { |
||||||
|
#does no validation of doctools commands |
||||||
|
#existence of string match #\**!doctools is taken as evidence enough that the file has inline doctools - review |
||||||
|
if {![file exists $fname]} { |
||||||
|
error "get_doctools_comments file '$fname' not found" |
||||||
|
} |
||||||
|
set fd [open $fname r] |
||||||
|
set data [read $fd] |
||||||
|
close $fd |
||||||
|
if {![string match "*#\**!doctools*" $data]} { |
||||||
|
return |
||||||
|
} |
||||||
|
set data [string map [list \r\n \n] $data] |
||||||
|
set in_doctools 0 |
||||||
|
set doctools "" |
||||||
|
foreach ln [split $data \n] { |
||||||
|
set ln [string trim $ln] |
||||||
|
if {$in_doctools && [string index $ln 0] != "#"} { |
||||||
|
set in_doctools 0 |
||||||
|
} elseif {[string range $ln 0 1] == "#*"} { |
||||||
|
#todo - process doctools ordering hints in tail of line |
||||||
|
set in_doctools 1 |
||||||
|
} elseif {$in_doctools} { |
||||||
|
append doctools [string range $ln 1 end] \n |
||||||
|
} |
||||||
|
} |
||||||
|
return $doctools |
||||||
|
} |
||||||
|
#todo - proc autogen_doctools_comments {fname} {} |
||||||
|
# - will probably need to use something like parsetcl - as we won't be able to reliably source in an interp without side-effects and use info body etc. |
||||||
|
# - mechanism will be to autodocument namespaces, procs, methods where no #*** doctools indication present - but use existing doctools comments for that particular item if it is present. |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
## Ready |
||||||
|
package provide punk::docgen [namespace eval punk::docgen { |
||||||
|
variable pkg punk::docgen |
||||||
|
variable version |
||||||
|
set version 0.1.0 |
||||||
|
}] |
||||||
|
return |
@ -0,0 +1,397 @@ |
|||||||
|
# -*- 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. |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
# (C) 2023 |
||||||
|
# |
||||||
|
# @@ Meta Begin |
||||||
|
# Application punk::path 0.1.0 |
||||||
|
# Meta platform tcl |
||||||
|
# Meta license <unspecified> |
||||||
|
# @@ Meta End |
||||||
|
|
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
# doctools header |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
#*** !doctools |
||||||
|
#[manpage_begin punkshell_module_punk::path 0 0.1.0] |
||||||
|
#[copyright "2023"] |
||||||
|
#[titledesc {Filesystem path utilities}] [comment {-- Name section and table of contents description --}] |
||||||
|
#[moddesc {punk path filesystem utils}] [comment {-- Description at end of page heading --}] |
||||||
|
#[require punk::path] |
||||||
|
#[description] |
||||||
|
#[keywords module path filesystem] |
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
|
||||||
|
#*** !doctools |
||||||
|
#[section Overview] |
||||||
|
#[para] overview of punk::path |
||||||
|
#[para] Filesystem path utility functions |
||||||
|
#[subsection Concepts] |
||||||
|
#[para] - |
||||||
|
|
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
## Requirements |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
|
||||||
|
#*** !doctools |
||||||
|
#[subsection dependencies] |
||||||
|
#[para] packages used by punk::path |
||||||
|
#[list_begin itemized] |
||||||
|
|
||||||
|
package require Tcl 8.6 |
||||||
|
#*** !doctools |
||||||
|
#[item] [package {Tcl 8.6}] |
||||||
|
|
||||||
|
# #package require frobz |
||||||
|
# #*** !doctools |
||||||
|
# #[item] [package {frobz}] |
||||||
|
|
||||||
|
#*** !doctools |
||||||
|
#[list_end] |
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
|
||||||
|
#*** !doctools |
||||||
|
#[section API] |
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
# oo::class namespace |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
namespace eval punk::path::class { |
||||||
|
#*** !doctools |
||||||
|
#[subsection {Namespace punk::path::class}] |
||||||
|
#[para] class definitions |
||||||
|
if {[info commands [namespace current]::interface_sample1] eq ""} { |
||||||
|
#*** !doctools |
||||||
|
#[list_begin enumerated] |
||||||
|
|
||||||
|
# oo::class create interface_sample1 { |
||||||
|
# #*** !doctools |
||||||
|
# #[enum] CLASS [class interface_sample1] |
||||||
|
# #[list_begin definitions] |
||||||
|
|
||||||
|
# method test {arg1} { |
||||||
|
# #*** !doctools |
||||||
|
# #[call class::interface_sample1 [method test] [arg arg1]] |
||||||
|
# #[para] test method |
||||||
|
# puts "test: $arg1" |
||||||
|
# } |
||||||
|
|
||||||
|
# #*** !doctools |
||||||
|
# #[list_end] [comment {-- end definitions interface_sample1}] |
||||||
|
# } |
||||||
|
|
||||||
|
#*** !doctools |
||||||
|
#[list_end] [comment {--- end class enumeration ---}] |
||||||
|
} |
||||||
|
} |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
# Base namespace |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
namespace eval punk::path { |
||||||
|
namespace export * |
||||||
|
#variable xyz |
||||||
|
|
||||||
|
#*** !doctools |
||||||
|
#[subsection {Namespace punk::path}] |
||||||
|
#[para] Core API functions for punk::path |
||||||
|
#[list_begin definitions] |
||||||
|
|
||||||
|
|
||||||
|
proc pathglob_as_re {pathglob} { |
||||||
|
#*** !doctools |
||||||
|
#[call [fun pathglob_as_re] [arg pathglob]] |
||||||
|
#[para] Returns a regular expression for matching a path to a glob pattern which can contain glob chars *|? in any segment of the path structure |
||||||
|
#[para] ** matches any number of subdirectories. |
||||||
|
#[para] e.g /etc/**/*.txt will match any .txt files at any depth below /etc (except directly within /etc itself) |
||||||
|
#[para] e.g /etc/**.txt will match any .txt files at any depth below /etc |
||||||
|
#[para] any segment that does not contain ** must match exactly one segment in the path |
||||||
|
#[para] e.g the glob /etc/*/*.doc - will match any .doc files that are exactly one tree level below /etc |
||||||
|
#[para] The pathglob doesn't have to contain glob characters, in which case the returned regex will match the pathglob exactly as specified. |
||||||
|
#[para] Regular expression syntax is deliberateley not supported within the pathglob string so that supplied regex characters will be treated as literals |
||||||
|
|
||||||
|
|
||||||
|
#todo - consider whether a way to escape the glob chars ? * is practical - to allow literals ? * |
||||||
|
# - would require counting immediately-preceding backslashes |
||||||
|
set pats [list] |
||||||
|
foreach seg [file split $pathglob] { |
||||||
|
if {[string range $seg end end] eq "/"} { |
||||||
|
set seg [string range $seg 0 end-1] ;# e.g c:/ -> c: / -> "" so that join at end doesn't double up |
||||||
|
} |
||||||
|
if {$seg eq "*"} { |
||||||
|
lappend pats {[^/]*} |
||||||
|
} elseif {$seg eq "**"} { |
||||||
|
lappend pats {.*} |
||||||
|
} else { |
||||||
|
set seg [string map [list {^ {\^} $ {\$} [} {\[} ( {\(} \{ \\\{ \\ {\\}] $seg] ;#treat regex characters in the input as literals |
||||||
|
set seg [string map [list . {[.]}] $seg] |
||||||
|
if {[regexp {[*?]} $seg]} { |
||||||
|
set pat [string map [list ** {.*} * {[^/]*} ? {[^/]}] $seg] |
||||||
|
lappend pats "$pat" |
||||||
|
} else { |
||||||
|
lappend pats "$seg" |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return "^[join $pats /]\$" |
||||||
|
} |
||||||
|
proc globmatchpath {pathglob path args} { |
||||||
|
#*** !doctools |
||||||
|
#[call [fun globmatchpath] [arg pathglob] [arg path] [opt {option value...}]] |
||||||
|
#[para] Return true if the pathglob matches the path |
||||||
|
#[para] see [fun pathglob_as_re] for pathglob description |
||||||
|
#[para] Caller must ensure that file separator is forward slash. (e.g use file normalize on windows) |
||||||
|
#[para] |
||||||
|
#[para] Known options: |
||||||
|
#[para] -nocase 0|1 (default 0 - case sensitive) |
||||||
|
#[para] If -nocase is not supplied - default to case sensitive *except for driveletter* |
||||||
|
#[para] ie - the driveletter alone in paths such as c:/etc will still be case insensitive. (ie c:/ETC/* will match C:/ETC/blah but not C:/etc/blah) |
||||||
|
#[para] Explicitly specifying -nocase 0 will require the entire case to match including the driveletter. |
||||||
|
|
||||||
|
set defaults [dict create\ |
||||||
|
-nocase \uFFFF\ |
||||||
|
] |
||||||
|
set known_opts [dict keys $defaults] |
||||||
|
set opts [dict merge $defaults $args] |
||||||
|
dict for {k v} $args { |
||||||
|
if {$k ni $known_opts} { |
||||||
|
error "Unrecognised options $k - known options: $known_opts" |
||||||
|
} |
||||||
|
} |
||||||
|
# -- --- --- --- --- --- |
||||||
|
set opt_nocase [dict get $opts -nocase] |
||||||
|
set explicit_nocase 1 ;#default to disprove |
||||||
|
if {$opt_nocase eq "\uFFFF"} { |
||||||
|
set opt_nocase 0 |
||||||
|
set explicit_nocase 0 |
||||||
|
} |
||||||
|
# -- --- --- --- --- --- |
||||||
|
if {$opt_nocase} { |
||||||
|
return [regexp -nocase [pathglob_as_re $pathglob] $path] |
||||||
|
} else { |
||||||
|
set re [pathglob_as_re $pathglob] |
||||||
|
if {$explicit_nocase} { |
||||||
|
set ismatch [regexp $re $path] ;#explicit -nocase 0 - require exact match of path literals including driveletter |
||||||
|
} else { |
||||||
|
#caller is using default for -nocase - which indicates case sensitivity - but we have an exception for the driveletter. |
||||||
|
set re_segments [file split $re] ;#Note that file split c:/etc gives {c:/ etc} but file split ^c:/etc gives {^c: etc} |
||||||
|
set first_seg [lindex $re_segments 0] |
||||||
|
if {[regexp {^\^(.{1}):$} $first_seg _match driveletter]} { |
||||||
|
#first part of re is like "^c:" i.e a drive letter |
||||||
|
set chars [string tolower $driveletter][string toupper $driveletter] |
||||||
|
set re [join [concat "^\[$chars\]:" [lrange $re_segments 1 end]] /] ;#rebuild re with case insensitive driveletter only - use join - not file join. file join will misinterpret leading re segment. |
||||||
|
} |
||||||
|
#puts stderr "-->re: $re" |
||||||
|
set ismatch [regexp $re $path] |
||||||
|
} |
||||||
|
} |
||||||
|
return $ismatch |
||||||
|
} |
||||||
|
|
||||||
|
#todo - implement treefiles which acts like dirfiles but allows path globbing in the same way as punk::ns::ns/ |
||||||
|
#then review if treefiles can replace dirfiles or if both should exist (dirfiles can have literal glob chars in path segments - but that is a rare usecase) |
||||||
|
proc treefilenames {basepath tailglob args} { |
||||||
|
#*** !doctools |
||||||
|
#[call [fun treefilenames] [arg basepath] [arg tailglob] [opt {option value...}]] |
||||||
|
#basic (glob based) list of filenames matching tailglob - recursive |
||||||
|
#no natsorting - so order is dependent on filesystem |
||||||
|
set defaults [dict create\ |
||||||
|
-call-depth-internal 0\ |
||||||
|
-antiglob_paths {}\ |
||||||
|
] |
||||||
|
set opts [dict merge $defaults $args] |
||||||
|
set opt_antiglob_paths [dict get $opts -antiglob_paths] |
||||||
|
set CALLDEPTH [dict get $opts -call-depth-internal] |
||||||
|
|
||||||
|
set files [list] |
||||||
|
if {$CALLDEPTH == 0} { |
||||||
|
if {![file isdirectory $basepath]} { |
||||||
|
return [list] |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
set skip 0 |
||||||
|
foreach anti $opt_antiglob_paths { |
||||||
|
if {[globmatchpath $anti $basepath]} { |
||||||
|
set skip 1 |
||||||
|
break |
||||||
|
} |
||||||
|
} |
||||||
|
if {$skip} { |
||||||
|
return [list] |
||||||
|
} |
||||||
|
|
||||||
|
#todo - account for vfs where matched path could appear to be a directory but is mounted so could be a desired match? |
||||||
|
set dirfiles [glob -nocomplain -dir $basepath -type f $tailglob] |
||||||
|
lappend files {*}$dirfiles |
||||||
|
set dirdirs [glob -nocomplain -dir $basepath -type d *] |
||||||
|
foreach dir $dirdirs { |
||||||
|
set skip 0 |
||||||
|
foreach anti $opt_antiglob_paths { |
||||||
|
if {[globmatchpath $anti $dir]} { |
||||||
|
set skip 1 |
||||||
|
break |
||||||
|
} |
||||||
|
} |
||||||
|
if {$skip} { |
||||||
|
continue |
||||||
|
} |
||||||
|
set nextargs [dict merge $args [list -call-depth-internal [incr CALLDEPTH]]] |
||||||
|
lappend files {*}[treefilenames $dir $tailglob {*}$nextargs] |
||||||
|
} |
||||||
|
return $files |
||||||
|
} |
||||||
|
|
||||||
|
#maint warning - also in punkcheck |
||||||
|
proc relative {reference location} { |
||||||
|
#*** !doctools |
||||||
|
#[call [fun relative] [arg reference] [arg location]] |
||||||
|
#[para] Taking two directory paths, a reference and a location, computes the path |
||||||
|
# of the location relative to the reference. |
||||||
|
#[list_begin itemized] |
||||||
|
#[item] |
||||||
|
#[para] Arguments: |
||||||
|
# [list_begin arguments] |
||||||
|
# [arg_def string reference] The path from which the relative path to location is determined. |
||||||
|
# [arg_def string location] The location path which may be above or below the reference path |
||||||
|
# [list_end] |
||||||
|
#[item] |
||||||
|
#[para] Results: |
||||||
|
#[para] The relative path of the location to the reference path. |
||||||
|
#[para] Will return a single dot "." if the paths are the same |
||||||
|
#[item] |
||||||
|
#[para] Notes: |
||||||
|
#[para] Both paths must be the same type - ie both absolute or both relative |
||||||
|
#[para] Case sensitive. ie relative /etc /etC |
||||||
|
# will return ../etC |
||||||
|
#[para] On windows, the drive-letter component (only) is not case sensitive |
||||||
|
#[para] ie relative c:/etc C:/etc returns . |
||||||
|
#[para] but relative c:/etc C:/Etc returns ../Etc |
||||||
|
#[para] On windows, if the paths are absolute and specifiy different volumes, only the location will be returned. |
||||||
|
# ie relative c:/etc d:/etc/blah |
||||||
|
# returns d:/etc/blah |
||||||
|
#[list_end] |
||||||
|
|
||||||
|
#see also kettle |
||||||
|
# Modified copy of ::fileutil::relative (tcllib) |
||||||
|
# Adapted to 8.5 ({*}). |
||||||
|
|
||||||
|
#review - check volume info on windows.. UNC paths? |
||||||
|
if {[file pathtype $reference] ne [file pathtype $location]} { |
||||||
|
return -code error "Unable to compute relation for paths of different pathtypes: [file pathtype $reference] vs. [file pathtype $location], ($reference vs. $location)" |
||||||
|
} |
||||||
|
|
||||||
|
#avoid normalizing if possible (file normalize *very* expensive on windows) |
||||||
|
set do_normalize 0 |
||||||
|
if {[file pathtype $reference] eq "relative"} { |
||||||
|
#if reference is relative so is location |
||||||
|
if {[regexp {[.]{2}} [list $reference $location]]} { |
||||||
|
set do_normalize 1 |
||||||
|
} |
||||||
|
if {[regexp {[.]/} [list $reference $location]]} { |
||||||
|
set do_normalize 1 |
||||||
|
} |
||||||
|
} else { |
||||||
|
set do_normalize 1 |
||||||
|
} |
||||||
|
if {$do_normalize} { |
||||||
|
set reference [file normalize $reference] |
||||||
|
set location [file normalize $location] |
||||||
|
} |
||||||
|
|
||||||
|
set save $location |
||||||
|
set reference [file split $reference] |
||||||
|
set location [file split $location] |
||||||
|
|
||||||
|
while {[lindex $location 0] eq [lindex $reference 0]} { |
||||||
|
set location [lrange $location 1 end] |
||||||
|
set reference [lrange $reference 1 end] |
||||||
|
if {![llength $location]} {break} |
||||||
|
} |
||||||
|
|
||||||
|
set location_len [llength $location] |
||||||
|
set reference_len [llength $reference] |
||||||
|
|
||||||
|
if {($location_len == 0) && ($reference_len == 0)} { |
||||||
|
# Cases: |
||||||
|
# (a) reference == location |
||||||
|
|
||||||
|
set location . |
||||||
|
} else { |
||||||
|
# Cases: |
||||||
|
# (b) ref is: ref/sub = sub |
||||||
|
# loc is: ref = {} |
||||||
|
|
||||||
|
# (c) ref is: ref = {} |
||||||
|
# loc is: ref/sub = sub |
||||||
|
|
||||||
|
while {$reference_len > 0} { |
||||||
|
set location [linsert $location 0 ..] |
||||||
|
incr reference_len -1 |
||||||
|
} |
||||||
|
set location [file join {*}$location] |
||||||
|
} |
||||||
|
return $location |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#*** !doctools |
||||||
|
#[list_end] [comment {--- end definitions namespace punk::path ---}] |
||||||
|
} |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
|
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
# Secondary API namespace |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
namespace eval punk::path::lib { |
||||||
|
namespace export * |
||||||
|
namespace path [namespace parent] |
||||||
|
#*** !doctools |
||||||
|
#[subsection {Namespace punk::path::lib}] |
||||||
|
#[para] Secondary functions that are part of the API |
||||||
|
#[list_begin definitions] |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#*** !doctools |
||||||
|
#[list_end] [comment {--- end definitions namespace punk::path::lib ---}] |
||||||
|
} |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
#*** !doctools |
||||||
|
#[section Internal] |
||||||
|
namespace eval punk::path::system { |
||||||
|
#*** !doctools |
||||||
|
#[subsection {Namespace punk::path::system}] |
||||||
|
#[para] Internal functions that are not part of the API |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
||||||
|
## Ready |
||||||
|
package provide punk::path [namespace eval punk::path { |
||||||
|
variable pkg punk::path |
||||||
|
variable version |
||||||
|
set version 0.1.0 |
||||||
|
}] |
||||||
|
return |
||||||
|
|
||||||
|
#*** !doctools |
||||||
|
#[manpage_end] |
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue