{"id":16087525,"url":"https://github.com/dalehenrich/superdoit","last_synced_at":"2025-07-21T09:33:51.996Z","repository":{"id":42441357,"uuid":"342933170","full_name":"dalehenrich/superDoit","owner":"dalehenrich","description":null,"archived":false,"fork":false,"pushed_at":"2025-04-22T16:12:53.000Z","size":739,"stargazers_count":2,"open_issues_count":36,"forks_count":5,"subscribers_count":3,"default_branch":"v4.2","last_synced_at":"2025-04-22T17:32:06.557Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Smalltalk","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dalehenrich.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-02-27T18:51:00.000Z","updated_at":"2025-04-22T16:12:57.000Z","dependencies_parsed_at":"2024-04-02T17:37:04.580Z","dependency_job_id":"55952132-e285-41d0-983c-47eda82f2367","html_url":"https://github.com/dalehenrich/superDoit","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/dalehenrich/superDoit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dalehenrich%2FsuperDoit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dalehenrich%2FsuperDoit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dalehenrich%2FsuperDoit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dalehenrich%2FsuperDoit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dalehenrich","download_url":"https://codeload.github.com/dalehenrich/superDoit/tar.gz/refs/heads/v4.2","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dalehenrich%2FsuperDoit/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266276180,"owners_count":23903983,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-09T13:30:00.335Z","updated_at":"2025-07-21T09:33:51.975Z","avatar_url":"https://github.com/dalehenrich.png","language":"Smalltalk","funding_links":[],"categories":[],"sub_categories":[],"readme":"# superDoIt\n\nBRANCH | STATUS\n------------- | -------------\n**v4.2** | [![**v4.2** build status](https://github.com/dalehenrich/superDoit/actions/workflows/ci.yml/badge.svg?branch=v4.2)](https://github.com/dalehenrich/superDoit/actions)\n**v4.1** | [![**v4.1** build status](https://github.com/dalehenrich/superDoit/actions/workflows/ci.yml/badge.svg?branch=v4.1)](https://github.com/dalehenrich/superDoit/actions)\n**v3** | [![**v3** build status](https://github.com/dalehenrich/superDoit/actions/workflows/ci.yml/badge.svg?branch=v3)](https://github.com/dalehenrich/superDoit/actions)\n**v3.1** | [![**v3.1** build status](https://github.com/dalehenrich/superDoit/actions/workflows/ci.yml/badge.svg?branch=v3.1)](https://github.com/dalehenrich/superDoit/actions)\n**v2** | [![**v2** build status](https://github.com/dalehenrich/superDoit/actions/workflows/ci.yml/badge.svg?branch=v2)](https://github.com/dalehenrich/superDoit/actions)\n**v2.0** | [![**v2.0** build status](https://github.com/dalehenrich/superDoit/actions/workflows/ci.yml/badge.svg?branch=v2.0)](https://github.com/dalehenrich/superDoit/actions)\n**v2.1** | [![**v2.1** build status](https://github.com/dalehenrich/superDoit/actions/workflows/ci.yml/badge.svg?branch=v2.1)](https://github.com/dalehenrich/superDoit/actions)\n\n## Versions\n### v4.2\nDevelopment version intended for use with GsDevKit_stone:v2 and GemStone 3.5.3 and newer versions of GemStone. github actions for superDoit test 3.6.4 thru 3.6.6, 3.7.0, 3.7.1 and 3.7.2. while the GsDevKit_stones github actions tests 3.5.3, 3.5.8, 3.6.0.\nNote that GemStone either 3.7.0 or 3.7.1 or 3.7.2 is **required for all solo scripts**, which allows for supporting versions older that 3.6.4...\n\n### v4.1\nStable branch intended for use with SmalltalkCI, GsDevKit_stones:v1.1.x and versions of GemStone that are shipped with an extent0.rowan.dbf in $GEMSTONE/bin (tested from GemStone 3.6.4 thru 3.7.0).\n\n### v3\nIntended for .solo scripts used with versions of GemStone that are shipped with an extent0.rowan.dbf in $GEMSTONE/bin, GemStone 3.6.4 and newer versions of GemStone (currently tested thru 3.6.5). \n\n.stone scripts may be used with GemStone versions as old as 3.4.0.\n\n### v3.1\nStable branch for use by [smalltalkCI](https://github.com/hpi-swa/smalltalkCI)\n\n### v2\nIntended for use with older versions of GemStone: 3.6.1, 3.6.0, 3.5.7, 3.5.0 (tested versions)\n\n## Table of Contents\n1. [What is superDoit?](#what-is-superdoit)\n   - [Current best practices](#current-best-practices)\n   - [superDoit solution](#superDoit-solution)\n2. [solo, stone, and topaz scripts](#solo-stone-and-topaz-scripts)\n   - [.solo script](#solo-script)\n   - [.stone script](#stone-script)\n   - [.topaz script](#topaz-script)\n2. [superDoit sections](#superdoit-sections)\n3. [Installation](#superdoit-installation)\n4. [Examples](#examples)\n   - [executable .solo doit with methods and Rowan specs](#executable-solo-doit-with-methods-and-rowan-specs)\n2. [How does superDoit work?](#how-does-superdoit-work)\n3. [Rowan and superDoit](#rowan-and-superdoit)\n3. [Branch naming conventions](#branch-naming-conventions)\n\n## What is superDoit?\n`superDoit` is a scripting framework for writing shell scripts in [GemStone Smalltalk](https://gemtalksystems.com/products/gs64/) using [GemStone Topaz][topaz manual]. To install:\n```bash\n\tcd \u003cinstall dir\u003e\n  git clone git@github.com:dalehenrich/superDoit.git\n\tsuperDoit/bin/install.sh\n```\n\n### Current best practices\nCurrent best practices for writing a [topaz solo bash scripts to report the sum total size of tranlog files in the given directory][Topaz Solo Scripting using bash to pass arguments] involves creating 3 separate files (see [Scripting with topaz solo using sh-bang][Scripting with topaz solo using she-bang] for resons why 3 files are needed to handle command line arguments in topaz solo scripts):\n1. a bash script driver script named [gettranlogspace][gettranlogspace]:\n   ```\n   #!/bin/bash\n   export GEMSTONE=/lark1/users/gsadmin/3.6\n   $GEMSTONE/bin/topaz -lq -I $GEMSTONE/scripts/myini -S\n   $GEMSTONE/scripts/reporttranlogspace.tpz -- $1\n   ```\n2. a solo .topazini file named [myini][myini]:\n   ```\n   set user DataCurator pass swordfish\n   set gemstone gs64stone\n   set solologin on\n   ```\n3. a [topaz command file][topaz manual] named [reporttranlogspace.tpz][reporttranlogspace.tpz], that contains the Smalltalk code to calculate and report the sum of the tranlog sizes in the directory:\n   ```\n   login\n   run\n     | dir files sz |\n     dir := System commandLineArguments last.\n     files := GsFile \n        contentsOfDirectory: dir\n        onClient: false.\n     sz := 0.\n     files do: [:ea | sz := sz + (GsFile sizeOfOnServer: ea)].\n     GsFile gciLogClient: dir, ': tranlogs consume total ', \n        (sz / 1024) asInteger asString, ' KB'.\n   %\n   logout\n   exit\n   ```\nThe bash driver script would then be executed:\n```\nunix\u003e ./gettranlogspace /lark1/users/gsadmin/tranlogs\n/lark1/users/gsadmin/tranlogs: tranlogs consume total 98477 KB\n```\n\n### superDoit solution\n`superDoit` not only eliminates the need to create three separate files to run a solo script, but provides support for declaring command line options, help, debugging and [more](#superdoit-sections).\n\nHere is the `superDoit` version of [reporttranlogspace.solo][reporttranlogspace.solo]:\n```\n#!/usr/bin/env superdoit_solo\noptions\n{\n  SuperDoitRequiredOptionWithRequiredArg long: 'tranlogDir' short: 't'.\n}\n%\nusage\n-----\nUSAGE $basename [--help | -h] [--debug | -D] --tranlogDir=\u003ctranlog-directory-path\u003e\n\nDESCRIPTION\n  Calculate and report the sum of the tranlog sizes in the given \u003ctranlog-directory-path\u003e\n\nOPTIONS\n  -t, --tranlogDir=\u003ctranlog-directory-path\u003e\n                             path to tranlog directory\n  -h, --help                 display usage message\n  -D, --debug                bring up topaz debugger in the event of a script error\n\nEXAMPLES\n  $basename --help\n  $basename -D -t \u003ctranlog-directory-path\u003e\n  $basename -t \u003ctranlog-directory-path\u003e\n  $basename --tranlogDir=\u003ctranlog-directory-path\u003e\n-----\n%\ndoit\n  | sz |\n  sz := 0.\n  self tranlogDir asFileReference files\n    do: [:tranlogFile |\n      sz := sz + tranlogFile size ].\n  self stdout\n    nextPutAll: self tranlogDir;\n    nextPutAll: ': tranlogs consume total ';\n    nextPutAll: (sz / 1024) asInteger asString, ' KB'.\n  ^ self noResult\n%\n```\n**Executing** `./reporttranlogspace.solo -t $GS_HOME/server/stones/gs_361/tranlogs` produces:\n```\n/home/dhenrich/rogue/_homes/rogue/_home/server/stones/gs_361/tranlogs: tranlogs consume total 39617 KB\n```\n**Executing** `./reporttranlogspace.solo -h ` produces:\n```\n-----\nUSAGE reporttranlogspace.solo [--help | -h] [--debug | -D] --tranlogDir=\u003ctranlog-directory-path\u003e\n\nDESCRIPTION\n  Calculate and report the sum of the tranlog sizes in the given \u003ctranlog-directory-path\u003e\n\nOPTIONS\n  -t, --tranlogDir=\u003ctranlog-directory-path\u003e\n                             path to tranlog directory\n  -h, --help                 display usage message\n  -D, --debug                bring up topaz debugger in the event of a script error\n\nEXAMPLES\n  reporttranlogspace.solo --help\n  reporttranlogspace.solo -D -t \u003ctranlog-directory-path\u003e\n  reporttranlogspace.solo -t \u003ctranlog-directory-path\u003e\n  reporttranlogspace.solo --tranlogDir=\u003ctranlog-directory-path\u003e\n-----\n```\n**Executing** `./reporttranlogspace.solo` produces:\n```\nUserDefinedError: The required option 'tranlogDir' was not set.\n```\n**Executing** `./reporttranlogspace.solo -D` and entering `where` at topaz prompt produces:\n```\n-----------------------------------------------------\n Near line 62 of file /home/dhenrich/rogue/_homes/rogue/_home/shared/repos/superDoit/gemstone/superdoit.tpz\nGemStone: Error         Nonfatal\na UserDefinedError occurred (error 2318), reason:halt, The required option 'tranlogDir' was not set.\nError Category: 231169 [GemStone] Number: 2318  Arg Count: 1 Context : 20 exception : 102530817\nArg 1: [20 size:0 primitiveSize:0 cls: 76289 UndefinedObject] nil\nStopping at line 62 of /home/dhenrich/rogue/_homes/rogue/_home/shared/repos/superDoit/gemstone/superdoit.tpz\ntopaz 1\u003e where\n==\u003e 1 UserDefinedError (AbstractException) \u003e\u003e _signalToDebugger @10 line 8   [methId 101346817]\n2 UserDefinedError (AbstractException) \u003e\u003e defaultAction @2 line 18   [methId 101347073]\n3 UserDefinedError (AbstractException) \u003e\u003e _defaultAction @4 line 4   [methId 101346305]\n4 UserDefinedError (AbstractException) \u003e\u003e _signal @2 line 20   [methId 3833089]\n5 UserDefinedError (AbstractException) \u003e\u003e signal @2 line 47   [methId 3848449]\n6 SuperDoitExecutionClass (Object) \u003e\u003e error:    @6 line 7   [methId 6400001]\n7 [] in SuperDoitExecution \u003e\u003e getAndVerifyOptions @21 line 12   [methId 102538497]\n8 Dictionary \u003e\u003e keysAndValuesDo:                @9 line 11   [methId 12241665]\n9 SuperDoitExecutionClass (SuperDoitExecution) \u003e\u003e getAndVerifyOptions @10 line 8   [methId 102499841]\n10 [] in SuperDoitExecution \u003e\u003e doit              @6 line 5   [methId 102543617]\n11 ExecBlock0 (ExecBlock) \u003e\u003e on:do:              @3 line 44   [methId 5850369]\n12 SuperDoitExecutionClass (SuperDoitExecution) \u003e\u003e doit @2 line 8   [methId 102546689]\n13 SuperDoitDoitCommand \u003e\u003e executeAgainst:       @27 line 19   [methId 102584833]\n14 [] in SuperDoitCommandDefinition \u003e\u003e executeAgainst: @7 line 2   [methId 102500609]\n15 OrderedCollection (Collection) \u003e\u003e do:         @5 line 10   [methId 3419649]\n16 SuperDoitCommandDefinition \u003e\u003e executeAgainst: @3 line 2   [methId 102502913]\n17 [] in SuperDoitCommandParser \u003e\u003e parseAndExecuteScriptFile: @22 line 15   [methId 102511105]\n18 [] in AbstractFileReference \u003e\u003e readStreamDo:  @8 line 4   [methId 48130817]\n19 ExecBlock0 (ExecBlock) \u003e\u003e ensure:             @2 line 12   [methId 5852161]\n20 FileReference (AbstractFileReference) \u003e\u003e readStreamDo: @4 line 5   [methId 42354689]\n21 SuperDoitCommandParser \u003e\u003e parseAndExecuteScriptFile: @2 line 3   [methId 102520577]\n22 SuperDoitCommandParser class \u003e\u003e processInputFile @31 line 22   [methId 102519297]\n23 Executed Code                                 @2 line 6   [methId 102553601]\n24 GsNMethod class \u003e\u003e _gsReturnToC               @1 line 11   [methId 5673729]\n  [GsProcess 102639105]\ntopaz 1\u003e \n```\n**Executing** `./reporttranlogspace.solo --tranlogDir`produces:\n```\nUserDefinedError: Missing required argument for option 'tranlogDir' [b]\n```\n**Executing** `./reporttranlogspace.solo -t`produces:\n```\nUserDefinedError: Missing required argument for option 'tranlogDir' [d]\n```\n**Executing** `./reporttranlogspace.solo -t /tmp/oops`produces:\n```\nDirectoryDoesNotExist: Path / 'tmp' / 'oops'\n```\nOf course adding `-D` or `--debug` to any of the the above, will bring up the debugger and allow you to debug the error yourself.\n\nFor the complete list of `superDoit` file sections see [superDoit Sections](#superdoit-sections)\n\n## solo, stone, and topaz scripts\n`superDoit` scripts come in three flavors: [solo](#solo-script), [stone](#stone-script), [topaz](#topaz-script). By convention each type of script is identified by a .solo, .stone, .topaz file extenstion, so that users will know how to run and what to expect from the script.\n\n### solo script\nsolo scripts use a `solo login`, [a special kind of login, which does not require a running Stone. This allows a Gem session to start up and execute GemStone Smalltalk code (based on reading from a GemStone extent file), without any connection to a Stone. Without a Stone, a solo session is single-user, and changes to persistent objects cannot be committed. Solo sessions cannot, for example, run markForCollection in their own environments, nor execute methods that make or restore backups.][Topaz Solo for Scripting].\n\nsolo scripts start with a `#!/usr/bin/env superdoit_solo` shebang and `\u003cpath-to-superDot-git-clone\u003e/bin/superdoit_solo` needs to be in your path:\n```\n#!/usr/bin/env superdoit_solo\ndoit\n^ 3 + 4\n%\n```\nsolo scripts are run against an extent with [Rowan v2.2 installed](#rowan-and-superdoit). \n\nSee [.solo script installation](#solo-script-installation) for additional information about installing a topaz solo extent and product tree.\n\n### .stone script\nThe *doit* section contains the Smalltalk expressions to be executed and is terminated by *%*:\n```\n#!/usr/bin/env superdoit_stone\ndoit\n^ 3 + 4\n%\n```\n\n### .topaz script\nThe *doit* section contains the Smalltalk expressions to be executed and is terminated by *%*:\n```\n#!/usr/bin/env superdoit_topaz\nset u SystemUser p swordfish\nset gemstone gs64stone\nlogin\n\nrun\nGsFile stdout nextPutAll: (3 + 4) printString; lf\n%\n```\n\n## superDoit sections\nHere is a complete list of the sections that may be used in a `superDoit` script:\n1. [*doit*](#-section)\n2. [*options*](#options-section)\n3. [*usage*](#usage-section)\n1. [*method*](#method-section)\n2. [*instvars*](#instvars-section)\n3. [*input*](#input-section)\n4. [*method:*](#method-section-1)\n5. [*classmethod:*](#classmethod-section)\n6. [*customoptions*](#customoptions-section)\n7. [*projectshome*](#projectshome-section)\n8. [*specs*](#specs-section)\n9. [*specurls*](#specurls-section).\n\n### *doit* section\nA typical Smalltalk IDE will provide a facility for writing Smalltalk code in a workspace or playground, where you can quickly put together a collection of Smalltalk expressions for evaluation without having to resort to creating a class.\nIt is natural that the simplicity of the workspace be preserved in the superDoit *doit* section.\nThe *doit* section contains the Smalltalk expressions to be executed and is terminated by *%*:\n```\n#!/usr/bin/env superdoit_solo\ndoit\n^ 3 + 4\n%\n```\nThe script invokes the `superdoit_solo` program that arranges for [topaz solo](https://downloads.gemtalksystems.com/docs/GemStone64/3.5.x/GS64-Topaz-3.5/1-Tutorial.htm#pgfId-1125047) to be used to execute the *doit*.\n### *options* section\nAs with any other scripting language it is an absolute requirement to allow for the declaration of command line arguments.\nIn **superDoit**, the *options* section is used to declare a set of command line options for the script:\n```\n#!/usr/bin/env superdoit_solo\noptions\n{\n  SuperDoitRequiredOptionWithRequiredArg long: 'addend' short: 'a'.\n}\n%\ndoit\n  ^ 3 + (self addend) asNumber\n%\n```\nand the framework automatically arranges for a method to be created using the `long` name of the option.\nThe value of the option from the command line is returned as a String by the method.\nHere is the full list on command line options that are currently supported:\n```\noptions\n{\n\tSuperDoitOptionalOptionWithNoArg long: 'noarg'.\n\tSuperDoitOptionalOptionWithNoArg long: 'noarg' short: 'n'.\n\n\tSuperDoitOptionalOptionWithRequiredArg long: 'optional'.\n\tSuperDoitOptionalOptionWithRequiredArg long: 'optional' default: 'default'.\n\tSuperDoitOptionalOptionWithRequiredArg long: 'optional' short: 'o'.\n\tSuperDoitOptionalOptionWithRequiredArg long: 'optional' short: 'o' default: 'default'.\n\n\tSuperDoitRequiredOptionWithRequiredArg long: 'required'.\n\tSuperDoitRequiredOptionWithRequiredArg long: 'required' short: 'r'.\n}\n%\n```\nThe SuperDoitOptionalOptionWithNoArg returns `true` if the option is present on the command line and `false` if it is not present on the command line.\nThe SuperDoitOptionalOptionWithRequiredArg returns `nil` or the default value if not specified on the command line or the value of the option as a String if specified on the command line.\nThe SuperDoitRequiredOptionWithRequiredArg signals an error if the option is not present on the command and the value of the option as a String if specified on the command line.\n\n### *usage* section\nIt is also an absolute requirement that a scripting language provide usage information for the script.\nThe *usage* section contains structured help text that documents the script usage, terminated by *%*:\n```\n#!/usr/bin/env superdoit_solo\nusage\n-----\nUSAGE $basename [--help | -h] [--debug | -D]\n\nDESCRIPTION\n  Simple script that returns the result of evaluating `3+4`.\n\nOPTIONS\n  -h, --help                 display usage message\n  -D, --debug                bring up topaz debugger in the event of a script error\n\nEXAMPLES\n  $basename --help\n  $basename -D\n-----\n%\ndoit\n  3 + 4\n%\n```\nThe -h, --help, -D, and --debug options are pre-defined and require no declarations to be included.\nIf you want to change the options used for help and debugging, then you can use the [*customptions* section](examples/kitchenSink/uncommonCommandExample.stone#L6-L19)\n### *method* section\nI'm sure that all of us have written workspaces that could have benefited from a local method or two and shell scripts are no different, superDoit makes it possible to add local methods to the script. \nThe *method* section defines a Smalltalk method, terminated by *%*, that can be called from within the script:\n```\n#!/usr/bin/env superdoit_solo\nusage\n-----\nUSAGE $basename [--help | -h] [--debug | -D]\n\nDESCRIPTION\n  Simple script that demonstrates the definition and use of a script method.\n\nEXAMPLES\n  $basename --help\n  $basename -D\n-----\n%\nmethod\nthree\n  ^ 3\n%\ndoit\n  ^ self three + 4\n%\n```\n### *instvars* section\nIf you are going to allow methods in scripts, then you need to allow instance variables for sharing common state. \nThe [*instvars* section](examples/kitchenSink/commonCommandExample.stone#L58-L60), terminated by *%* defines script instance variables.\n\n### *input* section\nThe [*input* section](examples/kitchenSink/uncommonCommandExample.stone#L61-L63)), terminated by *%* can be used to load GemStone .gs files into the image.\n\n### *method:* section\nThe [*method:* section](examples/kitchenSink/uncommonCommandExample.stone#L94-L97)), terminated by *%* is used to define an instance method for a class that is already present in the image.\n\n### *classmethod:* section\nThe [*classmethod:* section](examples/kitchenSink/uncommonCommandExample.stone#L98-L101)), terminated by *%* is used to define a class method for a class that is already present in the image.\n\n### *customoptions* section\nThe [*customptions* section](examples/kitchenSink/uncommonCommandExample.stone#L6-L19)), terminated by *%* is used to override the default command line arguments: -h, --help, -D, and --debug.\n\n### *projectshome* section\nThe [*projectshome* section](examples/kitchenSink/uncommonCommandExample.stone#L64-L66), terminated by *%* is used to declare the value of the ROWAN_PROJECTS_HOME environment variable during the execution of the script.\n\n### *specs* section\nThe [*specs* section](examples/kitchenSink/uncommonCommandExample.stone#L67-L90), terminated by *%* contains an array of Rowan load specification STON objects used to load external projects into the image.\n\n### *specurls* section\nThe [*specurls* section](examples/kitchenSink/uncommonCommandExample.stone#L91-L93), terminated by *%* contains a list of spec urls that reference the location of a Rowan load specification STON object.\n\n## superDoit installation\n### .solo script installation\n1. download 3.6.1 product tree\n   ```bash\n   cd gemstone/products\n   ../../dev/downloadGemStone.sh 3.6.1\n   ```\n2. download 3.6.1 solo extent\n   ```bash\n   cd ../solo\n   curl  -L -O -s -S \"https://github.com/dalehenrich/superDoit/releases/download/v0.1.0/3.6.1_extent0.solo.dbf.gz\"\n   gunzip --stdout 3.6.1_extent0.solo.dbf.gz \u003e extent0.solo.dbf\n   chmod -w extent0.solo.dbf\n   ln -s ../products/GemStone64Bit3.6.1-x86_64.Linux product\n   ```\n3. Add `superDoit/bin` to your PATH:\n   ```bash\n   export PATH=\"$GS_HOME/shared/repos/superDoit/bin\":$PATH\n   ```\n   It is recommended that you add this expression to your .bashrc so that .solo scripts can be run without any special setup.\n## Examples\n### simplest executable .solo doit \n```\n#!/usr/bin/env superdoit_solo\ndoit\n3+4\n%\n```\n### simple executable .solo doit with default help and debugging options\n```\n#!/usr/bin/env superdoit_solo\nusage\nUSAGE $basename [--help | -h] [--debug | -D]\n\nDESCRIPTION\n  Evaluate the Smalltalk expression: 3+4 and return the result on stdout.\n\nOPTIONS\n --help | -h\n    Display usage message.\n  --debug | -D\n    Without this option, when an error occurs, the error message is written to\n      stdout. If this option is supplied, the topaz debugger will come in the \n      event of an error.\n\nEXAMPLES\n  $basename --help\n  $basename -h\n  $basename --debug\n  $basename -D\n  $basename\n%\ndoit\n\t3+4\n%\n```\n### executable .solo doit with methods and Rowan specs\n```\n#!/usr/bin/env superdoit_solo\nspecUrls\nhttps://raw.github.com/dalehenrich/RowanSample9/spec_0002/rowan/specs/spec_0002.ston\n%\nspecs\nRwLoadSpecificationV2 {\n\t#specName : 'spec_0022',\n\t#projectName : 'RowanSample9',\n\t#gitUrl : 'git@github.com:dalehenrich/RowanSample9.git',\n\t...\n}\n%\nusage\nUSAGE $basename [--help | -h] [--debug | -D]\n... and more\n%\nmethod\nx\n^ self y\n%\nmethod\ny\n^ 3+4\n%\ndoit\n\tself preDoitSpecLoad.\t\"load specs\"\n^ self x\n%\n```\n\n## How does superDoit work?\n\n## Rowan and superDoit\n*Note:* As of December, 2021, [Rowan v2.2][Rowan] and [Jadeite][Jadeite] should be treated as beta/alpha releases:\n1. GemStone upgrade of a Rowan extent is not supported.\n2. The Rowan API is not complete.\n3. [Jadeite][Jadeite] the Rowan IDE is not fully functional.\n\nHowever, with that said:\n1. Rowan v2.2. sports a GemStone port of [FileSystem][FileSystem] which greatly improves the File manipulation API for GemStone, a critical capability for scripting\n2. Rowan v2.2 can be used for loading external projects into a topaz solo stone. \nFor example, an [OrderedDictionary .superDoitCI.solo][OrderedDictionary .superDoitCI.solo] script is used to run [Github CI for a port of OrderedDictionary to the GemStone kernel using Rowan][OrderedDictionary github action]\n\n## Branch naming conventions\n1. vX\n2. vX.Y\n3. vX.Y.Z or vX.Y.Z-id\n\n### vX\nStable production branch.\n\nX is incremented whenever there is a breaking change.\nvX.Y and vX.Y.Z branches are merged into the VX branch, when development is complete on the feature or patch.\n\n### vX.Y\nStable feature/bugfix candidate branch.\n \nY is incremented whenever work on a new feature or bugfix is started.\nvX.Y branches are merged into the VX branch when development is complete.\n\nPrimary work takes place on a vX.Y.Z branch and the VX.Y.Z branch is merged into the VX.Y branch at stable points, so if you want to have early access to a feature or bugfix, it is relatively safe to use this branch in production.\n\n### vX.Y.Z\nUnstable development branch.\n\nZ is incremented whenever work on a new feature or bugfix is started.\nA pre-release may be used to further identify the purpose of the work.\n\nPrimary work takes place on this branch and cannot be depended upon to be stable.\n\n[topaz manual]: https://downloads.gemtalksystems.com/docs/GemStone64/3.6.x/GS64-Topaz-3.6/GS64-Topaz-3.6.htm\n[Scripting with topaz solo using she-bang]: https://downloads.gemtalksystems.com/docs/GemStone64/3.6.x/GS64-Topaz-3.6/1-Tutorial.htm#pgfId-1131973\n[Topaz Solo Scripting using bash to pass arguments]: https://downloads.gemtalksystems.com/docs/GemStone64/3.6.x/GS64-Topaz-3.6/1-Tutorial.htm#pgfId-1126780\n[Topaz Solo for Scripting]: https://downloads.gemtalksystems.com/docs/GemStone64/3.6.x/GS64-Topaz-3.6/1-Tutorial.htm#pgfId-1125047\n[gettranlogspace]: https://downloads.gemtalksystems.com/docs/GemStone64/3.6.x/GS64-Topaz-3.6/1-Tutorial.htm#pgfId-1126891\n[myini]: https://downloads.gemtalksystems.com/docs/GemStone64/3.6.x/GS64-Topaz-3.6/1-Tutorial.htm#pgfId-1127344\n[reporttranlogspace.tpz]: https://downloads.gemtalksystems.com/docs/GemStone64/3.6.x/GS64-Topaz-3.6/1-Tutorial.htm#pgfId-1127310\n\n[reporttranlogspace.solo]: examples/utility/reporttranlogspace.solo\n[Rowan]: https://github.com/GemTalk/Rowan\n[Jadeite]: https://github.com/GemTalk/Jadeite\n[FileSystem]: https://github.com/pharo-project/pharo/tree/Pharo9.0/src/FileSystem-Core\n[OrderedDictionary .superDoitCI.solo]: https://github.com/GsDevKit/OrderedDictionary/blob/rowanize/.superDoitCI.solo\n[OrderedDictionary github action]: https://github.com/GsDevKit/OrderedDictionary/runs/4415167050?check_suite_focus=true#step:5:27\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdalehenrich%2Fsuperdoit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdalehenrich%2Fsuperdoit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdalehenrich%2Fsuperdoit/lists"}