Haskell package filestore
provides an interface for a versioning file store. It uses git, Darcs and Mercurial as a backend. Here's a short walk-through to get you started.
Documentation
In Data.FileStore.Types you find the most important functions such as initialise
. save
. retrieve
, delete
, etc. Data.FileStore.Generic has some utility function like modify
, create
, etc. For more details see the package description on hackage.
Walk-through
First activate the language extension and import the package:
{-# LANGUAGE TemplateHaskell #-}
import Data.FileStore
To initialise a filestore first create a FileStore
instance (here I choose the git backend, but you could just as well use mercurialFileStore
or darcsFileStore
)
let f = gitFileStore "mystore"
initialize f
then create an author and then a new file "some_file.txt"
let a = Author "Max" "max@example.com"
create f "some_file.txt" a "describe the revision" "some content"
Let's view the resources in the filestore:
i <- index f
print i
This will just print a list of filenames, in this case
that's ["some_file.txt"]
.
To get the revision ID of a file you can use latest
latest f "some_file.txt"
As an example of how to use the searchRevisions utility function I show you another way to retrieve the newest revision ID. The following will print a list of Revision objects.
rs <- searchRevisions f False "some_file.txt" ""
print rs
and we can use that to extract the first revID:
let i = head $ map (\(Revision i t a d cs) -> i) rs
Next, let's create a new revision of the file by modifying it:
m <- modify f "some_file.txt" i a "description of change" "new content!"
Let's print the revisions again:
rs <- searchRevisions f False "some_file.txt" ""
print rs
To retrieve the content of a file just call content
:
content <- (retrieve f "some_file.txt" Nothing) :: IO String
print content
The generic utility function smartRetrieve does the same but allows to also retrieve by revision ID (to get the latest revision use Nothing
):
-- read content of file
content <- (smartRetrieve f False "some_file.txt" Nothing) :: IO String
print content
Querying
Let's first add some more files (author a
and filestore f
were defined above):
create f "second-file.txt" a "2nd file" "222222222"
create f "third-file.txt" a "3rd file" "3333333"
Now we have three files as index f
shows:
["second-file.txt","some_file.txt","third-file.txt"]
Let's define and apply a query:
q = SearchQuery ["2"] False False True
The result is
[SearchMatch {matchResourceName = "second-file.txt", matchLineNumber = 1, matchLine = "222222222"}]
The signature of the SearchQuery
function is
argument | type | desc |
---|---|---|
queryPatterns | [String] | Patterns to match |
queryWholeWords | Bool | Match patterns only with whole words? |
queryMatchAll | Bool | Return matches only from files in which all patterns match? |
queryIgnoreCase | Bool | Make matches case-insensitive? |
And that's it.
The source code is available on github.