NAME
    GitStore - Git as versioned data store in Perl

VERSION
    version 0.16

SYNOPSIS
        use GitStore;

        my $gs = GitStore->new('/path/to/repo');
        $gs->set( 'users/obj.txt', $obj );
        $gs->set( ['config', 'wiki.txt'], { hash_ref => 1 } );
        $gs->commit();
        $gs->set( 'yyy/xxx.log', 'Log me' );
        $gs->discard();
    
        # later or in another pl
        my $val = $gs->get( 'user/obj.txt' ); # $val is the same as $obj
        my $val = $gs->get( 'config/wiki.txt' ); # $val is { hashref => 1 } );
        my $val = $gs->get( ['yyy', 'xxx.log' ] ); # $val is undef since discard

DESCRIPTION
    It is inspired by the Python and Ruby binding. check SEE ALSO

CLASS FUNCTIONS
  create( $directory )
    Creates the directory, initialize it as a git repository, and returns
    its associated "GitStore" object.

        my $gs = GitStore->create( '/tmp/mystore' );

METHODS
  new
        GitStore->new('/path/to/repo');
        GitStore->new( repo => '/path/to/repo', branch => 'mybranch' );
        GitStore->new( repo => '/path/to/repo', author => 'Someone Unknown <unknown\@what.com>' );

    repo
        your git directory or work directory (*GitStore* will assume it's a
        work directory if it doesn't end with ".git").

    branch
        your branch name, default is 'master'

    author
        It is used in the commit info

    serializer
        Can be used to define a serializing function that will be used if
        the value to save is a reference. When invoked, the function will be
        passed a reference to the store object, the path under which the
        value will be saved, and the value itself. For example, one could do
        different serialization via:

            my $store = GitStore->new(
                repo => '/path/to/repo',
                serializer => sub {
                    my( $store, $path, $value ) = @_;

                    if ( $path =~ m#^json# ) {
                        return encode_json($value);
                    }
                    else {
                        # defaults to YAML
                        return YAML::Dump($value);
                    }
                },
            );

        The default serializer uses "nfreeze" in Storable.

    deserializer
        Called when a value is picked from the store to be (potentially)
        deserialized. Just like the serializer function, it is passed three
        arguments: the store object, the path of the value to deserialize
        and the value itself. To revisit the example for "serializer", the
        full serializer/deserializer dance would be:

            my $store = GitStore->new(
                repo => '/path/to/repo',
                serializer => sub {
                    my( $store, $path, $value ) = @_;

                    return $path =~ m#^json# 
                                        ? encode_json($value)
                                        : YAML::Dump($value)
                                        ;
                },
                deserializer => sub {
                    my( $store, $path, $value ) = @_;
            
                    return $path =~ #^json#
                                        ?decode_json($value)
                                        : YAML::Load($value)
                                        ;
                },
            );

        The default deserializer will try to deserialize the value retrieved
        from the store via "thaw" in Storable and, if this fails, return the
        value verbatim.

    autocommit
        If set to "true", any call to "set()" or "delete()" will
        automatically call an implicit "commit()". Defaults to "false".

  set($path, $val)
        $gs->set( 'yyy/xxx.log', 'Log me' );
        $gs->set( ['config', 'wiki.txt'], { hash_ref => 1 } );
        $gs->set( 'users/obj.txt', $obj );

    Store $val as a $path file in Git

    $path can be String or ArrayRef. Any leading slashes ('/') in the path
    will be stripped, as to make it a valid Git path. The same grooming is
    done for the "get()" and "delete()" methods.

    $val can be String or Ref[HashRef|ArrayRef|Ref[Ref]] or blessed Object

  get($path)
        $gs->get( 'user/obj.txt' );
        $gs->get( ['yyy', 'xxx.log' ] );

    Get $val from the $path file

    $path can be String or ArrayRef

  get_revision( $path )
    Like "get()", but returns the GitStore::Revision object corresponding to
    the latest Git revision on the monitored branch for which $path changed.

  delete($path)
  remove($path)
    remove $path from Git store

  commit
        $gs->commit();
        $gs->commit('Your Comments Here');

    commit the set changes into Git

  discard
        $gs->discard();

    discard the set changes

  exist($path)
    Returns *true* if an object exists at the given path.

  history($path)
    Returns a list of GitStore::Revision objects representing the changes
    brought to the *$path*. The changes are returned in ascending commit
    order.

  list($regex)
        @entries = $gs->list( qr/\.txt$/ );

    Returns a list of all entries in the repository, possibly filtered by
    the optional *$regex*.

FAQ
  why the files are not there?
    run

        git checkout

  any example?
        # if you just need a local repo, that's all you need.
        mkdir sandbox
        cd sandbox
        git init
        # use GitStore->new('/path/to/this/sandbox')
        # set something
        git checkout
    
        # follows are for remote git url
        git remote add origin git@github.com:fayland/sandbox2.git
        git push origin master
        # do more GitStore->new('/path/to/this/sandbox') later
        git checkout
        git pull origin master
        git push

KNOWN BUGS
    If all files are deleted from the repository, a 'dummy' file will be
    created to keep Git happy.

SEE ALSO
    Article
        <http://www.newartisans.com/2008/05/using-git-as-a-versioned-data-st
        ore-in-python.html>

    Python binding
        <http://github.com/jwiegley/git-issues/tree/master>

    Ruby binding
        <http://github.com/georgi/git_store/tree/master>

Git URL
    <http://github.com/fayland/perl-git-store/tree/master>

AUTHORS
    *   Fayland Lam <fayland@gmail.com>

    *   Yanick Champoux <yanick@cpan.org>

COPYRIGHT AND LICENSE
    This software is copyright (c) 2015 by Fayland Lam <fayland@gmail.com>.

    This is free software; you can redistribute it and/or modify it under
    the same terms as the Perl 5 programming language system itself.