[Glass] Moving from .mcz files to git - help

Dale Henrichs via Glass glass at lists.gemtalksystems.com
Sat May 13 11:46:10 PDT 2017



On 5/12/17 1:21 PM, Reg Krock via Glass wrote:
> Hi,
>
> I was able to successfully load the .mcz files into the 3.3.3 server with your help.
>
> Now the issue is how to go forward since I do not have an already defined metacello for my project (ConfigurationOfMyProject).
Stef and Mariano have written a very good introduction to Metacello[1], 
then read the "Create Baseline" section[2] in the Getting Started with 
Github doc[3]. You need to use a BaselineOf with github projects. The 
BaselineOf describes package load order and project dependencies.
>
> 1) Can I have a local copy of git while still interacting with GitHub?
Yes. First you probably want to review the Github WorkFlow[4] which will 
give you an overview of working with local git clones and Github. If you 
are not familiar with git I recommend looking at this site[5] to get an 
overview and then google any git questions you have ... git-scm.com[6] 
has a good getting started section for git as well as complete 
documentation.
> 2) What hints/directions do you have about setting up gitfiletree, and other needed pieces. I have watched your video on creating a project but there are still some pieces missing.
>
I assume that you are using GsDevKIt_home and tODE. GsDevKit_home 
provides a standard directory structure for stones and shared resources 
like shared git repositories for projects.

$GS_HOME/shared/repos is the directory where all shared git projects are 
found and you will locate your local project git repositories there as well.

If you didn't have any existing packages and were starting a project 
from scratch, the `project new` command would create your baseline, a 
package, a project entry and a git repository for your project[9].

You have a couple of existing mcz packages .... instead of giving you a 
list of tode commands to execute, I decided to write a tode script 
(attached... copy the attached newProject.ston file to 
$GS_HOME/sys/local/server/home) that you can run ... it performs all of 
the major steps done by the `project new` command but takes a list of 
existing/loaded packages and a project name:

   /home/newProject 
-h                                                              # 
display script man page
   /home/newProject --packages=`Package-1 Package-2` Foo # create 
project Foo

At the end the script brings up a `project list` and you should see your 
project listed at the top of the list ...

I encourage you to look at the script (`edit /home/newProject`) to see 
what can be done in a tode shell script. Create your own with `touch sh 
<script-name>`) ... Scripts are very convenient for storing and sharing 
scripts between different stones ... By default scripts created in /home 
are local to the stone only, but you can move a script to 
/sys/local/server/home (`mv <script-name> /sys/local/server/home`) and 
it will be available to all stones ...

At this point, you have a project entry in a shared location 
($GS_HOME/sys/local/server/projects) so if you want to load your project 
into a new stone, you only need to do the following:

   project load Foo

or use 'load' menu item in `project list` or create a stone with the 
project loaded:

   createStone -f -l Foo foo_334 3.3.4

When you make modifications to the packages or baseline, you can review 
the changes you've made using the 'changes' menu item in the project 
list or commit your changes to the git repository using the 'save' menu 
item in the project list.

Finally, I suggest that you create a /home/go script (`touch tpz 
/home/go`) to setup your environment at login. Open browsers, class 
lists, tests, etc. At the moment the go file is not automatically 
executed. I've attached one of my own `go` files as an example. After 
opening the shell window, I run `./go` to set things up ... or if the 
windows get too cluttered, I do a `close` then `./go` to get back to a 
clean starting point.

Hope this helps,

Dale

[1] 
http://pharobooks.gforge.inria.fr/PharoByExampleTwo-Eng/latest/Metacello.pdf
[2] 
https://github.com/dalehenrich/metacello-work/blob/master/docs/GettingStartedWithGitHub.md#create-baseline
[3] 
https://github.com/dalehenrich/metacello-work/blob/master/docs/GettingStartedWithGitHub.md#getting-started-with-github
[4] https://guides.github.com/introduction/flow/index.html
[5] https://rogerdudler.github.io/git-guide/
[6] https://git-scm.com/book/en/v2/Getting-Started-Git-Basics
[7] 
https://github.com/GsDevKit/GsDevKit_home#open-source-development-kit-for-gemstones-64-bit-
[8] https://github.com/GsDevKit/GsDevKit_home/tree/gh-pages
[9] 
https://github.com/GsDevKit/GsDevKit_home/blob/master/docs/projectsInTode.md#creating-a-new-project
-------------- next part --------------
TDScriptLeafNode{#name:'newProject',#contents:'[ :topez :objIn :tokens :command :commandNode | 
  | opts args |
  \"for help: ./newProject -h\"
  command
    getOptsMixedLongShort:
      {#(\'help\' $h #\'none\').
      #(\'packages\' nil #\'required\')}
    optionsAndArguments: [ :options :operands | 
      opts := options.
      args := operands ].
  opts
    at: \'help\'
    ifAbsent: [ 
      | projectEntry packageNames projectName projectTool mcTool toolBox registration path dir gitRepoDir gitRepoPath gitTool baselinePackageName |
      projectTool := topez toolInstanceFor: \'project\'.
      mcTool := topez toolInstanceFor: \'mc\'.
      packageNames := #().
      projectName := args at: 1.
      projectEntry := TDProjectSpecEntryDefinition new.
      gitRepoPath := \'$GS_HOME/shared/repos/\' , projectName.
      path := \'$GS_HOME/shared/repos/\' , projectName , \'/repository\'.
      gitRepoDir := ServerFileDirectory on: gitRepoPath.
      gitRepoDir assureExistence.
      gitRepoDir createDirectory: \'repository\'.
      gitTool := topez toolInstanceFor: \'git\'.
      gitTool gitinitIn: gitRepoDir with: \'\'.\t\"Step 1. Create a git repository for the project in $GS_HOME/shared/repos\"
      projectEntry
        baseline: projectName
          repository: \'filetree://\' , path
          loads: #(\'default\');
        status: #(#\'active\');
        locked: true.
      projectEntry
        createProjectEntryInNode: \'/sys/local/server/projects\'
        topez: topez.\t\"Step 2. Create project entry for the project\"
      opts
        at: \'packages\'
        ifPresent: [ :arg | 
          packageNames := arg findTokens: \' \'.
          packageNames
            do: [ :packageName | 
              | matches |
              matches := mcTool findMatchingPackages: packageName topez: topez.
              matches isEmpty
                ifTrue: [ 
                  | wc |
                  wc := mcTool mccreate: packageName.
                  wc modified: true.
                  wc repositoryGroup addRepository: projectEntry repository ].
              matches
                do: [ :wc | 
                  wc packageName = packageName
                    ifTrue: [ 
                      \"Step 3. Add the new repository to each of the listed packages\"
                      wc modified: true.
                      wc repositoryGroup addRepository: projectEntry repository ] ] ] ].
      baselinePackageName := \'BaselineOf\' , projectName.
      projectTool
        projectNewCheckAndCreatePackage: baselinePackageName
        for: projectEntry
        mcTool: mcTool
        force: false.
      (toolBox := MetacelloToolBox baselineNamed: projectName)
        createBaselineOfMethod: \'baseline:\' inCategory: \'baseline\';
        addBaselineOfSection: #\'gemstone\'
          requiredProjects: #()
          packages: packageNames
          repositories: #()
          dependencies: #()
          groups: #()
          versionSpecsDo: [ :versionSpec |  ];
        commitBaselineOfMethod.\t\"Step 4. Create a BaselineOf for the project\"
      registration := projectTool
        resolveProjectRegistrationReference: projectName.
      projectTool
        projectCommit: registration
        configCommit: false
        gitCommit: true
        commitMessage: \'initial commit\'.\t\"Step 5. Commit the new baseline and packages to the new git repository\"
      MetacelloProjectRegistration
        registrationForProjectSpec: registration projectSpec
        ifAbsent: [ :new | self error: \'New project spec unexpectedly unregistered\' ]
        ifPresent: [ :existing :new | 
          \"register as a loaded project\"
          existing
            copyOnWrite: [ :existingCopy | 
              \"Step 6. Register the new project as loaded in the image\"
              existingCopy
                loadedInImage: true;
                merge: new ] ].
      topez evaluateCommandString: \'project list\'\t\"Step 7. Open the `project list`\" ]
    ifPresent: [ :ignored | 
      TDManPage
        viewManPage:
          \'NAME
  newProject - newProject script utility template
SYNOPSIS
  newProject [-h|--help] [--packages=<list of package names>] <project-name>
DESCRIPTION
  Create a new project for a project that currently consistes of a couple of 
  mcz files that are already loaded in the image.

  Step 1. Create a git repository for the project in $GS_HOME/shared/repos 
  Step 2. Create project entry for the project
  Step 3. Add the new repository to each of the listed packages
  Step 4. Create a BaselineOf for the project
  Step 5. Commit the new baseline and packages to the new git repository
  Step 6. Register the new project as loaded in the image
  Step 7. Open the `project list`

EXAMPLES
  ./newProject --help
  ./newProject -h

  ./newProject --packages=`Foo-Core Foo-Tests` Foo
\'
        topez: topez ] ]',#creationTime:DateAndTime['2017-05-13T07:27:43.1166250705719-07:00'],#modificationTime:DateAndTime['2017-05-13T09:57:39.8648419380188-07:00']}
-------------- next part --------------
# browse class --exact --hier AbstractIndexSpecification GsOptions GsIndexSpec
browse class --full EnumeratedPathTerm
browse class ^gs ^btree 
browse method --spec PathTerm>>addMappingsForObject:traverseUpTo:for:logging:
project list
edit /home/go
project browse --tests GLASS1
# test class BtreePlusEqualityTests
# limit format false
# project browse --classes GLASS1
eval `System configurationAt: #GemExceptionSignalCapturesStack put: true`


More information about the Glass mailing list