Skip to content

Commit

Permalink
Partial conversion to jgit
Browse files Browse the repository at this point in the history
  • Loading branch information
GladeDiviney committed Jan 12, 2016
1 parent bc047c5 commit 8936594
Show file tree
Hide file tree
Showing 2 changed files with 118 additions and 30 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,14 @@ package com.gladed.gradle.androidgitversion

import org.gradle.api.Project
import org.gradle.api.Plugin
import org.eclipse.jgit.api.Git
import org.eclipse.jgit.storage.file.FileRepositoryBuilder
import org.eclipse.jgit.lib.Constants
import org.eclipse.jgit.lib.Repository
import org.eclipse.jgit.revwalk.RevCommit
import org.eclipse.jgit.lib.Ref
import org.eclipse.jgit.revwalk.RevTag
import org.eclipse.jgit.revwalk.RevWalk

class AndroidGitVersion implements Plugin<Project> {
void apply(Project project) {
Expand Down Expand Up @@ -45,29 +53,65 @@ class AndroidGitVersionExtension {
* - BRANCH is the current branch name (skipped if a known release branch)
*/
final def name() {
// Collect current build info
def commit = "git rev-parse --short HEAD".execute().text.trim()
def branch = "git rev-parse --abbrev-ref HEAD".execute().text.trim()
def lastTaggedCommit = "git describe --match ${project.androidGitVersion.tagPrefix}[0-9]* --tags --abbrev=0".
execute().text.trim()
Repository repo
try {
repo = new FileRepositoryBuilder().
readEnvironment().
findGitDir(project.rootDir).
build()
} catch (IllegalArgumentException e) {
// No repo found
return "unknown"
}

def git = Git.wrap(repo)
def head = repo.getRef(Constants.HEAD).getTarget()
// No commits?
if (!head.getObjectId()) return "unknown"

def currentBranch = repo.getBranch()
Iterable<RevCommit> commits = git.log().add(head.getObjectId()).all().call()
Iterable<RevTag> tags = git.tagList().call().collect { ref ->
RevWalk walk = new RevWalk(repo)
walk.parseTag(ref.getObjectId())
}

def lastTags = commits.findResult { commit ->
def tagsHere = tags.findAll { tag ->
tag.getObject().getId().equals(commit) &&
tag.getTagName().matches('^' + tagPrefix + '[0-9].*$')
}
if (tagsHere) return tagsHere.collect { it.getTagName() - tagPrefix }
}

// No decent tags?
if (!lastTags) return "unknown"
return lastTags.first();

// Construct version if possible
if (!lastTaggedCommit) return "unknown"
def commitsSinceLastTag = ("git rev-list $lastTaggedCommit..HEAD" + (project.androidGitVersion.restrictDirectory ? " -- ." : "")).
execute().text.trim().readLines().size()
return gitLastTag(lastTaggedCommit, project.androidGitVersion.tagPrefix) +
(commitsSinceLastTag ? ".$commitsSinceLastTag-$commit" : "") +
(project.androidGitVersion.releaseBranches.contains(branch) ? "" : "-" + branch)
// // Collect current build info
// def commit = "git rev-parse --short HEAD".execute().text.trim()
// def branch = "git rev-parse --abbrev-ref HEAD".execute().text.trim()
// def lastTaggedCommit = "git describe --match ${tagPrefix}[0-9]* --tags --abbrev=0".
// execute().text.trim()
//
// println("****CURRENT COMMIT IS " + commit)
// // Construct version if possible
// if (!lastTaggedCommit) return "unknown"
// def commitsSinceLastTag = ("git rev-list $lastTaggedCommit..HEAD" + (restrictDirectory ? " -- ." : "")).
// execute().text.trim().readLines().size()
// return gitLastTag(lastTaggedCommit, tagPrefix) +
// (commitsSinceLastTag ? ".$commitsSinceLastTag-$commit" : "") +
// (releaseBranches.contains(branch) ? "" : "-" + branch)
}

/**
* Return a version code corresponding to current root version (as per tag).
* For example a tag of 1.22.333 will return 100220333
*/
final def code() {
def lastTaggedCommit = "git describe --match ${project.androidGitVersion.tagPrefix}[0-9]* --tags --abbrev=0".
def lastTaggedCommit = "git describe --match ${tagPrefix}[0-9]* --tags --abbrev=0".
execute().text.trim()
return !lastTaggedCommit ? 0 : gitLastTag(lastTaggedCommit, project.androidGitVersion.tagPrefix).
return !lastTaggedCommit ? 0 : gitLastTag(lastTaggedCommit, tagPrefix).
split(/[^0-9]+/).findAll().
inject(0) { result, i -> result * 10000 + i.toInteger() };
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,33 +8,74 @@ import org.junit.rules.TemporaryFolder
class AndroidGitVersionTest extends GroovyTestCase {

def projectFolder = new TemporaryFolder()
File projectDir

// These properties don't exist until touched
@Lazy Git git = { initGit() }()
@Lazy AndroidGitVersionExtension plugin = { makePlugin() }()

public void testNoGitRepo() {
def plugin = getExtension();
assertEquals('unknown', plugin.name())
}

public void testNoTag() {
Git git = Git.init().setDirectory(projectDir).call();
def plugin = getExtension();
public void testNoCommits() {
git // touch to build
assertEquals('unknown', plugin.name())
}

public void testNoTags() {
addCommit()
assertEquals('unknown', plugin.name())
}

public void testTag() {
Git git = Git.init().setDirectory(projectDir).call()
git.add().addFilepattern("build.gradle").call()
git.commit().setMessage("first").call()
git.tag().setName("1.0").call()
def plugin = getExtension();
addCommit()
addTag('1.0')
assertEquals('1.0', plugin.name())
}

public void testNonVersionTag() {
addCommit()
addTag('checkpoint-1')
assertEquals('unknown', plugin.name())
}

public void testTagPrefix() {
addCommit()
addTag("lib-1.0");
plugin.tagPrefix = "lib-"
assertEquals('1.0', plugin.name())
}

private void execute(String command) {
command.execute([], projectDir)
public void testMultiTag() {
addCommit()
addTag("1.0")
addCommit()
addTag("1.1")
assertEquals('1.1', plugin.name())
}

private AndroidGitVersionExtension getExtension() {
public void testMultiTagOnSameCommit() {
addCommit()
addTag("1.10")
addTag("1.9")
assertEquals('1.10', plugin.name())
}

private Git initGit() {
return Git.init().setDirectory(projectFolder.root).call();
}

private void addCommit() {
new File(projectFolder.root, "build.gradle").append("// addition")
git.add().addFilepattern("build.gradle").call()
git.commit().setMessage("addition").call()
}

private void addTag(String tagName) {
git.tag().setName(tagName).call()
}

private AndroidGitVersionExtension makePlugin() {
Project project = ProjectBuilder.builder()
.withProjectDir(projectFolder.root)
.build()
Expand All @@ -47,9 +88,12 @@ class AndroidGitVersionTest extends GroovyTestCase {
@Override
protected void setUp() throws Exception {
projectFolder.create()
projectDir = projectFolder.root
projectFolder.newFile("build.gradle")
System.setProperty("user.dir", projectDir.getAbsolutePath())
println('*** using ' + projectDir)
// System.setProperty("user.dir", projectFolder.root.getAbsolutePath())
}

@Override
protected void tearDown() throws Exception {
projectFolder.delete()
}
}

0 comments on commit 8936594

Please sign in to comment.