v0.1.76

  New features:

  - New --version-plain option for getting the fig version without any nice
    formatting (and no trailing newline in the output).  Useful for programatic
    access to the fig version.

v0.1.75

  Backwards incompatibilities:

  - Unquoted archive statements now have their values globbed if they don't
    look like URLs.  If you happen to have a statement like

      archive some/path/foo?bar*.tar.gz

    then this will match files that it did not previously find.

  New features:

  - Asset statements now behave identically, with the exception of the
    extraction of archive statements and the path preservation of resource
    statements.  Previously, archives weren't globbed, i.e. you couldn't say

      archive yadda/*.tar.gz

    You had to specify all archives individually.

  - New --run-command-statement option that allows you to run command
    statements in unpublished packages.  (No more need to publish to test
    whether they work!)  Say you have a package.fig file in the current
    directory that looks like

      config default
        command "echo hello!"
      end

    If you just run "fig", it still says that there's nothing to do, but it
    additionally warns you about the situation.  You can get non-default
    commands to run using the --config option, e.g. "fig
    --run-command-statement --config run-chrome":

      config run-chrome
        command "chrome ..."
      end

  - New grammar statement to allow for future expansion.  Syntax:

      grammar v<number>

    This statement is only valid as the first statement in a package
    definition.  In other words

      grammar v0
      config default
      end

    is valid, but

      config default
      end
      grammar v0

    is not.  The only valid version right now is 0, but this means that we can
    change the syntax in the future without breaking any existing packages.

    Note that this statement will be emitted for all published packages, but
    will be commented out so that older versions of Fig can still read them.
    For example, the significant parts of the package definition generated by
    "fig --publish foo/5 --set variable=value" are:

      # grammar v0
      config default
        set variable=value
      end

v0.1.74.beta.3
v0.1.74.beta.2
v0.1.74.beta.1

  - Test releases

v0.1.73

  Backwards incompatibilities:

  - --update-lock-response is, for the time being, no longer supported on
    Windows.  Dealing with file locking on Windows is hard and we don't have
    the time to figure it right now.

  Bug fixes:

  - FIG_HOME locking didn't cover all the situations that it should have, e.g.
    the --clean option.

  - Crash when --command-extra-args was specified without a package descriptor.

v0.1.72.beta.2
v0.1.72.beta.1

  - Test releases

v0.1.71

  Backwards incompatibilities:

  - Packages, resources, archives, and configs cannot have names that are
    keywords (other than "config") in order to have more clear parse error
    messages and allow for future expandability.  (You didn't really want a
    package named "end" did you?)

  New features:

  - Default for --update-lock-response is now "wait" instead of "fail".
    However, if a pre-existing lock is encountered and you haven't explicitly
    specified "--update-lock-response wait", you'll get a warning about the
    wait.  Note that this warning is not influenced by --log-level.

  - Can specify the location of the remote repository via ~/.figrc or the value
    of the --figrc parameter by specifying a value for "default
    FIG_REMOTE_URL", e.g.

      { "default FIG_REMOTE_URL" : "file:///some/path" }

  - New --dump-package-definition-text option, which gives you the text of the
    base package.  Useful for looking at published packages.

  - New --dump-package-definition-parsed option, which, surprise, gives you the
    the base package after Fig has digested it.  Note that you won't see the
    result of --set/--append/--archive/--resource options in this because those
    get stored outside of the base package.

  - Warns on ignored --archive/--resource options.

  - The output "--help" was getting way too long.  The text that it now emits
    is non-comprehensive, but it should fit onto a single screen and includes
    pointers to the new "--options" and "--help-long" options.

  Bug fixes:

  - Loading an overridden package version that had one config include another
    config of the same package could cause problems in some circumstances.

v0.1.70.beta.1

  - Test release

v0.1.69

  Backwards incompatibilities:

  - While publishing, you cannot simultaneously have a package definition file
    (e.g. "package.fig") and use environment variable options (--set/--append).
    Previous to now, any package definition file would simply be ignored and
    the publish would happen based upon the environment variable options.

    - Easier to understand, yet unlikely to already exist case:

        fig package/1.2.3 --publish --set VARIABLE=VALUE --file non-default.fig

      Is this supposed to mean publish based upon the --set option or the
      --file option?  Again, it was the former, but that was non-obvious.

    - More likely existing case:

        fig package/1.2.3 --publish --set VARIABLE=VALUE

      while there is a "package.fig" file in the current directory.
      Workaround: use the "--no-file" option:

        fig package/1.2.3 --publish --set VARIABLE=VALUE --no-file

    Just to be clear, it's perfectly fine (and useful) to have combined a
    package definition file and environment variable options when not
    publishing.

  New feature (and backwards incompatibility):

  - Locks FIG_HOME when updating.  (Or attempts to.  If FIG_HOME is on NFS, all
    bets are off.)  By default, if Fig is updating and notices another instance
    updating, it will fail.  You can override this behavior via
    --update-lock-response.  Specify "wait" to get Fig to wait for lock release
    or "ignore" for it to skip lock checking.

    The default behavior of failing was chosen to prevent surprises in the
    scenario of starting multiple servers out of the same directory:

        for exchange in cme ice liffe cboe
        do
            fig --update -- run-server $exchange &
        done

    If Fig defaulted to waiting, the above scenario would silently cause three
    out of the four servers to block until the other one's updates were
    finished.

  Bug fixes:

  - Specifying --update with FIG_REMOTE_URL using FTP should be fast as it used
    to be.

  - Skips retrieving directories and files to themselves.  (Tragic accident of
    retrieving "." onto itself resulted in a corrupted git repo.)

v0.1.68.beta.2
v0.1.68.beta.1

  - Test releases

v0.1.67

  Backwards incompatibilities:

  - The --update and --update-if-missing options are always paid attention to.
    (Hey, you said update; Fig endeavors to comply.) This causes problems where
    these were previously ignored.

    - If you specify --clean, you'll get an error about the options not
      agreeing about whether the base package should be loaded.

    - Publishing may fail if you have versionless includes.  Workaround: don't
      use versionless includes or do the update and the publish separately.

  Bug fixes:

  - Updating and using any of the --list-* options would delete any previously
    retrieved files.

  - More fixes in dealing with symlinks.

  - Better error reporting for failed installations and package version
    conflicts.

v0.1.66.beta.2
v0.1.66.beta.1

  - Test releases

v0.1.65

  Bug fixes:

  - Treat trailing double-slashes in environment variable statements as if they
    weren't there, i.e.

        set FOO=blah//

    is the same as

        set FOO=blah

v0.1.64

  Backwards incompatibilities:

  - --set and --append command-line options now take priority over package.fig
    files and --include options are now processed after any "include"
    statements.

    Previously, "fig foo/1.2.3 --set SET=command-line --append
    APPEND=command-line --include command-line/1.2.3" was equivalent to

      config default
        set SET=command-line
        add APPEND=command-line
        include command-line/1.2.3

        include foo/1.2.3
      end

    Now it is equivalent to

      config default
        include foo/1.2.3

        set SET=command-line
        add APPEND=command-line
        include command-line/1.2.3
      end

    (It really is like that: a package is synthesized with statements
    equivalent to the command-line options and that package is run through the
    whole process.)

  - Retrieve variable names can no longer contain "@", "/", or ".".  Since
    environment variable statements only allow alphanumerics and underscore in
    the variable names, any retrieve variable with those characters in its name
    would never have any effect.

  - Running fig --publish or --publish-local with --resource or --archive
    options without also specifying a --set or --append option is now an error.

    What would previously happen is that the --resource and --archive options
    were ignored and package.fig locating would happen and the publish would be
    based only on that.  Probably not what was intended.

    E.g.:

      fig --publish foo/1 --resource=something.txt

    would ignore the --resource option, look for a package.fig file and publish
    based upon that.

  - Now fails if you specify both a descriptor and the --file option and you
    aren't publishing.  Previously it would silently ignore the --file option,
    which could be a bit more than a little surprising.

  New features:

  - Overrides are now independent statements, no longer attached to includes.
    E.g. this

      config default
        include A/1 override C/3
        include B/1 override C/3
      end

    is now equivalent to this

      config default
        override C/3
        include A/1
        include B/1
      end

    No changes to existing (functioning) package.fig files will be necessary.
    In fact, this will fix some that didn't work due to versionless includes.

  - You can now specify overrides on the command-line using "--override".

  - Now checks repository format version and fails if it's different from what
    it knows about.

    There are no immediate plans to change the repository format, but
    considering the inability to fix the non-unique archive name issue below,
    it behooves us to allow for a format change in the future.  If the layout
    does change, then current code could possibly corrupt the future
    repository.

  - Warns if you attempt to use a "retrieve" statement to write to an absolute
    path; all retrieve destinations are relative.

  - Now warns about ineffectual "retrieve" statements.

  - A lot of existence checks have been added, resulting in nicer error
    messages and fewer stack traces.

  - README.md has had most of its content ripped out.  Documentation has been
    greatly expanded and is available at https://github.com/mfoemmel/fig/wiki.

  - Includes the Fig version in the comments in published .fig files.

  Bug fixes:

  - Better command-line parsing.  There were a number of scenarios where
    missing or malformed arguments to options would cause incorrect behavior or
    stack traces.

  - Handling of symlinks is better.

  - Now checks that archive base names are unique before allowing publishing.
    Previously, if you had something like

        archive http://somewhere/archive.tar.gz
        archive foo/archive.tar.gz

    everything would work locally, but the version of the package published to
    the remote repository was corrupt.  Given the current repository layout,
    this is not fixable, so we now disallow publishing packages like this.

    Similarly, we now complain about archives named "resources.tar.gz" because
    Fig creates an archive by that name to hold resources.

  - Updates should be more robust in the face of simultaneous runs of fig.

  - Retrieves:

    * Now saves retrieve metadata prior to an exec(2).  Previously, if you ran
      a command, Fig would lose track of what you had in your current
      directory.

    * Cleanup of retrieves for no-longer-referenced packages now happens, i.e.,
      if a dependency removes a dependency, files are correctly removed.

      Note that, depending upon the packages involved, switching between two
      base packages can be slower than it was before.  In other words, if
      packages "foo" and "bar" have a lot of retrieves of dependences NOT in
      common, running

          fig --update-if-missing foo/v1.2.3
          fig --update-if-missing bar/v6.5.4

      will be slower.  On the other hand, you won't have a lot of stuff from
      "foo" hanging around that shouldn't be there.

v0.1.63.beta.2
v0.1.63.beta.1

  - Test releases

v0.1.62

  Bug fixes:

  - Fixed stack trace when encountering conflicting dependency package
    versions.

v0.1.61

  New features:

  - Constraints on the values of "resource", "append", "path", "add", and "set"
    statements greatly relaxed (prompted by C++ libraries with "++" in their
    names).

  - The package name can now include a "_" for parsing. Previously you could
    publish a package with an underscore in the name but would be unable to
    subsequently use it.

  Bug fixes:

  - Removed dependency on the 'ftp' gem.

v0.1.60.alpha.2
v0.1.60.alpha.1

  - Test releases

v0.1.59

  Backwards incompatibilities:

  - Specifying a config in the descriptor and --config is now an error, i.e you
    can't do:

        fig package/1.2.3:some_config --config some_other_config

    Allowing configurations in both locations was ambiguous and the developers,
    let alone users, couldn't tell which configuration would prevail.

  New features:

  - "--list-variables" option.  This will display all variables manipulated by
    Fig, following package dependencies recursively.  Can have
    "--list-all-configs" and "--list-tree" applied to it for tracking down
    where that nasty setting of EDITOR to "emacs" comes from.

    Example "--list-variables --list-tree" output:

        A/1.2.3
        |   CLASSPATH = something:$CLASSPATH
        |   FROM_A    = blah
        '---C/5.6.7
        |       CLASSPATH = something_else:$CLASSPATH
        |       FROM_C    = blah
        '---B/1.2.3
                CLASSPATH = planet_x:$CLASSPATH
                FROM_B    = blah

    See README.md for more.

    Suggestions for changes to the output format welcome.

  - "--command-extra-args" option.  Allows you to say that the rest of the fig
    command-line is to be appended to the end of the command in a "command"
    statement.

  - The .fig file created in a repository now contains metadata about
    the publishing of the package (time/user/host).

  - Logging output is colorized if going to a tty on *nix.  This includes
    restoration of the old colorization of local package downloads/deletions.
    Colors are not currently configurable.

  - The primary package is now treated the same as other packages as far as
    updates are concerned.  Previously, if you started with a new environment,
    e.g. FIG_HOME was empty, running "fig foo/1.2.3 -- echo foo" would fall
    over.  Even asking for updates ("fig --update foo/1.2.3 -- echo foo")
    wouldn't change anything.  Now the latter case will work.

  - "--suppress-warning-include-statement-missing-version" option and "suppress
    warnings" entry in figrc will, unsurprisingly, turn off warnings for things
    like "include foo" in included packages.  Note that this will NOT turn off
    these warnings for the contents of a package.fig file.

    The idea is that, while not having a version on an include is a bad idea,
    you don't decide on the contents of your dependencies.  So, this allows you
    to stop Fig from complaining about things you can't control, while still
    yelling at you for things that you do.

  - The test suite passes on MS Windows!

  Bug fixes:

  - You can publish packages that have versionless includes again.

  Significant Internals:

  - The definition of a package descriptor has become more restrictive in the
    Ruby code.  This shouldn't be an issue because the Treetop grammar has
    already restricted it this way; this is just a check from the Ruby side.

v0.1.58.beta.1
v0.1.58.alpha.2
v0.1.58.alpha.1

  - Test releases

v0.1.57

  - Logging output now goes to stderr by default, instead of stdout.

v0.1.56.alpha

  - Test release

v0.1.55

  - "include" of another package without specifying a version is now a warning
    about its ability to work is dependent upon include ordering.

v0.1.54

  - Emits an error when you've got an "include" of another package without
    specifying the version.  It used to be the case that you could leave the
    version off, but that would only work if there was a "current" version of
    the depended upon package published.  Which meant that you'd have to
    --force the publication of the "current" version.

v0.1.53

  - Fix bug in doing "fig -u" when the remote repository has a figrc file.

v0.1.52

  Notice:

  A lot of internal changes have been made to make future changes easier and
  test coverage is significantly better than it was before.  We believe that we
  haven't broken anything (other than the purposeful changes below), but due to
  the scope of the changes, we may have done so.  Please report any problems
  you run into.

  Backwards incompatibilities:

  - Now requires at least ruby v1.8.7.

  - You can no longer run a command without using "--".  Through an accident of
    implementation, you previously could do

        fig echo foo

    You are now required to run this as

        fig -- echo foo

  - You can no longer specify multiple --clean or --list-configs options.

  - There was partial support for overridding the local location of a package
    via a "fig.properties" file in the current directory.  A full
    implementation of this type of thing may come in the future, but for the
    time being, in the efforts of making the code clean, this is gone.

  - Development now requires at least rspec 2.8.

  New features:

  - "--list-dependencies" option.  This will list all dependencies a given
    package has, recursively.

    For example, if you have package A which depends upon packages B and C
    which both depend upon package D, running

        fig --list-dependencies A/1.2.3

    will give you

        B/2.3.4
        C/3.4.5
        D/4.5.6

    If you additionally specify "--list-tree", you'll get a nested dependency
    tree:

        fig --list-dependencies --list-tree A/1.2.3

        A/1.2.3
            B/2.3.4
                D/4.5.6
            C/3.4.5
                D/4.5.6

    If you don't specify a package descriptor, but you've got a package.fig
    file in the current directory with the same dependencies as package A
    above, you'll get

        fig --list-dependencies --list-tree

        <unpublished>
            B/2.3.4
                D/4.5.6
            C/3.4.5
                D/4.5.6

    If there are no dependencies, you don't specify "--list-tree", and stdout
    is connected to a terminal:

        fig --list-dependencies package-with-no-dependencies/1.2.3

        <no dependencies>

    However, if stdout is not connected to a terminal:

        fig --list-dependencies package-with-no-dependencies/1.2.3 | cat

        [no output]

    Additionally, you can specify "--list-all-configs"; this will follow all
    the configurations in the base package.  Note that this will show multiple
    versions of the same package if different configurations depend upon
    different versions.

v0.1.51

  - You can now set an environment variable to the empty string with "set".

  - Fix bug with same env variable in both APPEND and RETRIEVE statements,
    causing Fig to attempt to retrieve libs intended for publish. (The bug
    was introduced in 0.1.49, in commit aa3f3ab6c7, while fixing another bug).

v0.1.50

  - Trying to get releases via rake to work properly for multiple platforms.

v0.1.49

  - Finalizing figrc name for URL whitelist.

v0.1.47-48

  - Exception, regex, and test refactoring.

  - Fixing operator precedence in environment.

  - Updated copyright years.

  - Changed README example to use file:// URL.

  - Change ssh:// tests to file:// tests.

  - Refactored '[package]' substitution.

  - Implemented @ escaping in variables.

v0.1.46

  - Rakefile improvements.

  - Fixing broken reference to Fig::Logging in environment.rb.


v0.1.43-0.1.45

  - Rakefile improvements.

  - Test file refactoring/improvements.

  - Complains if it has nothing to do.

v0.1.42

  - Fig::Package refactoring.

  - "file:" protocol works for FIG_REMOTE_URL.

  - Testing no longer requires ssh.

  - Implemented whitelist chceking after parse.

  - Simplify character classes in grammar, slight grammar refactoring.

  - Supports MacOS (better) in Rakefile.

  - No longer emits stack trace for invalid command line option(s).

  - Tests emits std(out|err) on failure, for ease in debugging test failures.


v0.1.41

  - Release cleanup


v0.1.40

  - Works on Mac (in conjunction with libarchive-static 1.0.1).

  - Supports configuration via rc files in JSON format.  These can be (in
    ascending order of priority of values):
      - in the repository under "_meta/figrc"
      - in your home directory in ".figrc"
      - specified on the command-line via the "--figrc" option

    Note that values from all the above locations will be merged into a
    single, net application configuration.  E.g. if
    <repository>/_meta/figrc contains

      {"a" => 5, "b" => 7"}

    and ~/.figrc contains

      {"a" => 37}

    then Fig will see a value for "a" of 37 and a value for "b" of 7.

    Processing of ~/.figrc can be suppressed via the "--no-figrc" option.

  - Supports logging via log4r. Configure via "log configuration" in the rc
    files or via the "--log-config" and "--log-level" command-line options.
    The configuration files must be in XML or YAML format in a way supported
    by log4r and contain configuration for a "fig" logger.  The "--log-level"
    will override any value found in the configuration files.

  - Added additional messages about activity including file download source
    and destination.  Try "--log-level debug".  Suggestions about changes to
    levels that are supported, which levels messages are emitted at, and any
    additional desired logging are welcome.

  - Supports "-v/--version" to emit the Fig version.

  - No longer silently does nothing when no arguments are specified.

  - Start of support for restricting URLs in package.fig files via a URL
    whitelist; not complete yet and will likely change.

  - RSpec usage has been upgraded to v2.