Erlang convenience wrapper around git executable.
Probably some day it should use geef low-level bindings and expose easy to use API.
Example of basic usage:
$ make sh
1> Local = "/tmp/erlgit".
"/tmp/erlgit"
2> git:clone("https://github.com/gleber/erlgit.git", Local).
{ok,"Cloning into '/tmp/erlgit'...\n"}
3> git:branches(Local).
["master"]
4> git:refs(Local).
[{"HEAD",'HEAD',"097428dda56dec6085747387645d6020f86cfae7"},
{"master",head,"097428dda56dec6085747387645d6020f86cfae7"},
{"origin/HEAD",remote, "097428dda56dec6085747387645d6020f86cfae7"},
{"origin/master",remote, "097428dda56dec6085747387645d6020f86cfae7"},
{"v0.3.0",tag,"be3b0ade881666286801ee8b218ecbf29da97558"},
{"v0.3.1",tag,"89f2d81be12f6034db52fd6d71d8a4b96f4ee9de"},
{"v0.3.2",tag,"3dc42981d9e4677654370614888ec3f368421240"},
{"v0.5.0",tag,"097428dda56dec6085747387645d6020f86cfae7"}]
5> git:branch(Local).
"master"
6> git:tags(Local).
["v0.3.0","v0.3.1","v0.3.2","v0.5.0"]
7> os:cmd("touch "++Local++"/new_file").
[]
8> git:status_is_dirty(Local).
true
9> git:status_changed_files(Local).
[{untracked,"./new_file"}]
10> os:cmd("echo >> "++Local++"/README.md").
[]
11> git:status_changed_files(Local).
[{modified,"./README.md"},{untracked,"./new_file"}]
12> git:add_files(Local, ["new_file"]).
{ok,[]}
13> git:status_changed_files(Local).
[{modified,"./README.md"},{indexed_added,"./new_file"}]
14> git:commit(Local, "update README and add file").
{ok,"[master 3825b3c] update README and add file\n 0 files changed\n create mode 100644 new_file\n"}
15> git:head(Local).
"3825b3cb5e713c5145b4b74445a4d5e6187e567d"
and it has some support for semantic versioning using erlsemver library:
16> rr("deps/erlsemver/include/*").
[semver]
17> git:version_tags(Local).
[#semver{x = 0,y = 3,z = 0,pre = <<>>,build = undefined},
#semver{x = 0,y = 3,z = 1,pre = <<>>,build = undefined},
#semver{x = 0,y = 3,z = 2,pre = <<>>,build = undefined},
#semver{x = 0,y = 5,z = 0,pre = <<>>,build = undefined}]
18> git:version_tags_commits(Local).
[{#semver{x = 0,y = 3,z = 0,pre = <<>>,build = undefined},
"be3b0ade881666286801ee8b218ecbf29da97558"},
{#semver{x = 0,y = 3,z = 1,pre = <<>>,build = undefined},
"89f2d81be12f6034db52fd6d71d8a4b96f4ee9de"},
{#semver{x = 0,y = 3,z = 2,pre = <<>>,build = undefined},
"3dc42981d9e4677654370614888ec3f368421240"},
{#semver{x = 0,y = 5,z = 0,pre = <<>>,build = undefined},
"097428dda56dec6085747387645d6020f86cfae7"}]
19> git:tag(Local, semver:inc_z(#semver{x = 0,y = 5,z = 0,pre = <<>>,build = undefined})).
#semver{x = 0,y = 5,z = 1,pre = <<>>,build = undefined}
20> lists:last(git:version_tags_commits(Local)).
{#semver{x = 0,y = 5,z = 1,pre = <<>>,build = undefined},
"3825b3cb5e713c5145b4b74445a4d5e6187e567d"}
and convenience function for fetching specific version of source code:
21> git:download("https://github.com/gleber/erlgit.git", "/tmp/erlgit", {tag, "v0.7.0"}).
{ok,[]}
22> git:refs("/tmp/erlgit").
[{"HEAD",'HEAD',"172e570f39020637d1e98326c746ad776242417f"},
{"master",head,"172e570f39020637d1e98326c746ad776242417f"},
{"origin/HEAD",remote, "172e570f39020637d1e98326c746ad776242417f"},
{"origin/master",remote, "172e570f39020637d1e98326c746ad776242417f"},
{"v0.5.0",tag,"da21ef41b800d1fd0c08d7d8f05b4489a0c3d2a8"},
{"v0.7.0",tag,"172e570f39020637d1e98326c746ad776242417f"}]
23> git:branch("/tmp/erlgit").
detached
24> git:checkout("/tmp/erlgit", "master").
{ok,[]}
25> git:branch("/tmp/erlgit").
{ok,"master"}
Gleb Peregud [email protected] for LivePress Inc.
Copyright 2011-2012 LivePress Inc.
MIT license