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.