Skip to content

BlackGlory/garland

Repository files navigation

garland

A folder hierarchy builder based on tags and symbolic links.

Install

npm install --global garland
# or
yarn add garland

Usage

Usage: garland [options] [command]

A folder hierarchy builder based on tags and symbolic links

Options:
  -V, --version                 output the version number
  --tag-definitions <filename>  tag definitions file
  -h, --help                    display help for command

Commands:
  tags                          list all tags
  build <blueprint>             build folder hierarchy
  test <expression>             test condition expression
  help [command]                display help for command

Tag definitions file

The tag definitions file is a YAML file with path and tag pairs.

When used in the garland build, the path in the tag definitions file is relative to the path of the file.

Structure:

interface ITagDefinitions {
  [path: string]: string[] | ITagDefinitions
}

Example 1:

example1.com:
  owner1:
    repo1: [tag1, tag2]

  owner2:
    repo2: [tag2, tag3]

example2.com:
  owner3:
    repo3: [tag3, tag4]

Example 2 (equivalent to Example 1):

example1.com/owner1/repo1: [tag1, tag2]
example1.com/owner2/repo2: [tag2, tag3]
example2.com/owner3/repo3: [tag3, tag4]

Blueprint file

The blueprint file is a YAML file with path and condition expression pairs.

When used in the garland build, the path in the blueprint file is relative to the path of current working directory.

The $condition field is used to write related condition expression (see below), When a path has multiple $condition fields, the logic and is implicitly included.

Structure:

interface IBlueprint {
  $condition?: string
  [path: string]: IBlueprint | null
}

Example:

# Create a folder `match-condition` and link all items that match condition `tag` there.
match-condition:
  $condition: tag

# Just create a folder `no-condition`.
no-condition:

# Create a folder `match-condition/subpath` and link all items that match condition `tag` there.
match-condition:
  $condition: tag
  subpath:
# Equivalent to 
match-condition:
  subpath:
    $condition: tag
# Equivalent to 
match-condition/subpath:
  $condition: tag

# Create folder `mulitple-conditions/subpath-a` and `multiple-conditions/subpath-b`.
# Link all items that match condition `common-tag and tag-a` to `mulitple-conditions/subpath-a`.
# Link all items that match condition `common-tag and tag-b` to `mulitple-conditions/subpath-b`.
multiple-conditions:
  $condition: common-tag
  subpath-a:
    $condition: tag-a
  subpath-b:
    $condition: tag-b
# Equivalent to 
multiple-conditions:
  subpath-a:
    $condition: common-tag and tag-a
  subpath-b:
    $condition: common-tag and tag-b
# Equivalent to 
multiple-conditions/subpath-a:
  $condition: common-tag and tag-a
multiple-conditions/subpath-b:
  $condition: common-tag and tag-b

Condition expression

Condition expression is a DSL represented by strings, which is used to perform logical operations on tags.

Tags are used as identifiers in this DSL, limited by the parser, identifiers can only use [a-zA-Z0-9_-] characters. Tags that exist are true values, and tags that do not exist are false values.

Keywords:

  • and
  • or
  • not
  • xor
  • (, )

Operator precedence:

  • (, )
  • not
  • and
  • xor
  • or

Suggestion

The tags used by garland should follow minimalism:

  • If you don't use the tag, there is no reason to remain it.
  • Do not use tags as a kind of notes or comments.
  • Only add the tags you will use in garland to avoid the number of tags growing to the point of being unmanageable.