- Support header color customizations (issue 209) | - Support header color customizations (issue 209) | ||||
- Support username substitution in web.otherUrls (issue 213) | - Support username substitution in web.otherUrls (issue 213) | ||||
- Option to force client-side basic authentication instead of form-based authentication if web.authenticateViewPages=true (issue 222) | - Option to force client-side basic authentication instead of form-based authentication if web.authenticateViewPages=true (issue 222) | ||||
- Set author as tooltip of last change column in the repositories panel (issue-238) | |||||
- Setting to automatically create an user account based on an authenticated user principal from the servlet container (issue-246) | - Setting to automatically create an user account based on an authenticated user principal from the servlet container (issue-246) | ||||
- Added WindowsUserService to authenticate users against Windows accounts (issue-250) | - Added WindowsUserService to authenticate users against Windows accounts (issue-250) | ||||
- Global and per-repository setting to exclude authors from metrics (issue-251) | - Global and per-repository setting to exclude authors from metrics (issue-251) |
import com.gitblit.utils.FederationUtils; | import com.gitblit.utils.FederationUtils; | ||||
import com.gitblit.utils.HttpUtils; | import com.gitblit.utils.HttpUtils; | ||||
import com.gitblit.utils.JGitUtils; | import com.gitblit.utils.JGitUtils; | ||||
import com.gitblit.utils.JGitUtils.LastChange; | |||||
import com.gitblit.utils.JsonUtils; | import com.gitblit.utils.JsonUtils; | ||||
import com.gitblit.utils.MetricUtils; | import com.gitblit.utils.MetricUtils; | ||||
import com.gitblit.utils.ObjectCache; | import com.gitblit.utils.ObjectCache; | ||||
model.hasCommits = JGitUtils.hasCommits(r); | model.hasCommits = JGitUtils.hasCommits(r); | ||||
} | } | ||||
model.lastChange = JGitUtils.getLastChange(r); | |||||
LastChange lc = JGitUtils.getLastChange(r); | |||||
model.lastChange = lc.when; | |||||
model.lastChangeAuthor = lc.who; | |||||
if (!model.skipSizeCalculation) { | if (!model.skipSizeCalculation) { | ||||
ByteFormat byteFormat = new ByteFormat(); | ByteFormat byteFormat = new ByteFormat(); | ||||
model.size = byteFormat.format(calculateSize(model)); | model.size = byteFormat.format(calculateSize(model)); | ||||
model.name = repositoryName; | model.name = repositoryName; | ||||
} | } | ||||
model.hasCommits = JGitUtils.hasCommits(r); | model.hasCommits = JGitUtils.hasCommits(r); | ||||
model.lastChange = JGitUtils.getLastChange(r); | |||||
LastChange lc = JGitUtils.getLastChange(r); | |||||
model.lastChange = lc.when; | |||||
model.lastChangeAuthor = lc.who; | |||||
model.projectPath = StringUtils.getFirstPathElement(repositoryName); | model.projectPath = StringUtils.getFirstPathElement(repositoryName); | ||||
StoredConfig config = r.getConfig(); | StoredConfig config = r.getConfig(); |
public String description; | public String description; | ||||
public List<String> owners; | public List<String> owners; | ||||
public Date lastChange; | public Date lastChange; | ||||
public String lastChangeAuthor; | |||||
public boolean hasCommits; | public boolean hasCommits; | ||||
public boolean showRemoteBranches; | public boolean showRemoteBranches; | ||||
public boolean useTickets; | public boolean useTickets; |
} | } | ||||
return false; | return false; | ||||
} | } | ||||
/** | |||||
* Encapsulates the result of cloning or pulling from a repository. | |||||
*/ | |||||
public static class LastChange { | |||||
public Date when; | |||||
public String who; | |||||
LastChange() { | |||||
when = new Date(0); | |||||
} | |||||
LastChange(long lastModified) { | |||||
this.when = new Date(lastModified); | |||||
} | |||||
} | |||||
/** | /** | ||||
* Returns the date of the most recent commit on a branch. If the repository | |||||
* does not exist Date(0) is returned. If it does exist but is empty, the | |||||
* last modified date of the repository folder is returned. | |||||
* Returns the date and author of the most recent commit on a branch. If the | |||||
* repository does not exist Date(0) is returned. If it does exist but is | |||||
* empty, the last modified date of the repository folder is returned. | |||||
* | * | ||||
* @param repository | * @param repository | ||||
* @return | |||||
* @return a LastChange object | |||||
*/ | */ | ||||
public static Date getLastChange(Repository repository) { | |||||
public static LastChange getLastChange(Repository repository) { | |||||
if (!hasCommits(repository)) { | if (!hasCommits(repository)) { | ||||
// null repository | // null repository | ||||
if (repository == null) { | if (repository == null) { | ||||
return new Date(0); | |||||
return new LastChange(); | |||||
} | } | ||||
// fresh repository | // fresh repository | ||||
return new Date(repository.getDirectory().lastModified()); | |||||
return new LastChange(repository.getDirectory().lastModified()); | |||||
} | } | ||||
List<RefModel> branchModels = getLocalBranches(repository, true, -1); | List<RefModel> branchModels = getLocalBranches(repository, true, -1); | ||||
if (branchModels.size() > 0) { | if (branchModels.size() > 0) { | ||||
// find most recent branch update | // find most recent branch update | ||||
Date lastChange = new Date(0); | |||||
LastChange lastChange = new LastChange(); | |||||
for (RefModel branchModel : branchModels) { | for (RefModel branchModel : branchModels) { | ||||
if (branchModel.getDate().after(lastChange)) { | |||||
lastChange = branchModel.getDate(); | |||||
if (branchModel.getDate().after(lastChange.when)) { | |||||
lastChange.when = branchModel.getDate(); | |||||
lastChange.who = branchModel.getAuthorIdent().getName(); | |||||
} | } | ||||
} | } | ||||
return lastChange; | return lastChange; | ||||
} | } | ||||
// default to the repository folder modification date | // default to the repository folder modification date | ||||
return new Date(repository.getDirectory().lastModified()); | |||||
return new LastChange(repository.getDirectory().lastModified()); | |||||
} | } | ||||
/** | /** |
add(ownersView); | add(ownersView); | ||||
add(WicketUtils.createTimestampLabel("repositoryLastChange", | add(WicketUtils.createTimestampLabel("repositoryLastChange", | ||||
JGitUtils.getLastChange(r), getTimeZone(), getTimeUtils())); | |||||
JGitUtils.getLastChange(r).when, getTimeZone(), getTimeUtils())); | |||||
add(new Label("repositorySize", model.size)); | add(new Label("repositorySize", model.size)); | ||||
if (metricsTotal == null) { | if (metricsTotal == null) { |
add(ownersView); | add(ownersView); | ||||
add(WicketUtils.createTimestampLabel("repositoryLastChange", | add(WicketUtils.createTimestampLabel("repositoryLastChange", | ||||
JGitUtils.getLastChange(r), getTimeZone(), getTimeUtils())); | |||||
JGitUtils.getLastChange(r).when, getTimeZone(), getTimeUtils())); | |||||
add(new Label("repositorySize", getRepositoryModel().size)); | add(new Label("repositorySize", getRepositoryModel().size)); | ||||
if (metricsTotal == null) { | if (metricsTotal == null) { | ||||
add(new Label("branchStats", "")); | add(new Label("branchStats", "")); |
Label lastChangeLabel = new Label("repositoryLastChange", lastChange); | Label lastChangeLabel = new Label("repositoryLastChange", lastChange); | ||||
row.add(lastChangeLabel); | row.add(lastChangeLabel); | ||||
WicketUtils.setCssClass(lastChangeLabel, getTimeUtils().timeAgoCss(entry.lastChange)); | WicketUtils.setCssClass(lastChangeLabel, getTimeUtils().timeAgoCss(entry.lastChange)); | ||||
if (!StringUtils.isEmpty(entry.lastChangeAuthor)) { | |||||
WicketUtils.setHtmlTooltip(lastChangeLabel, getString("gb.author") + ": " + entry.lastChangeAuthor); | |||||
} | |||||
boolean showOwner = user != null && entry.isOwner(user.username); | boolean showOwner = user != null && entry.isOwner(user.username); | ||||
boolean myPersonalRepository = showOwner && entry.isUsersPersonalRepository(user.username); | boolean myPersonalRepository = showOwner && entry.isUsersPersonalRepository(user.username); |
@Test | @Test | ||||
public void testLastCommit() throws Exception { | public void testLastCommit() throws Exception { | ||||
assertEquals(new Date(0), JGitUtils.getLastChange(null)); | |||||
assertEquals(new Date(0), JGitUtils.getLastChange(null).when); | |||||
Repository repository = GitBlitSuite.getHelloworldRepository(); | Repository repository = GitBlitSuite.getHelloworldRepository(); | ||||
assertTrue(JGitUtils.getCommit(repository, null) != null); | assertTrue(JGitUtils.getCommit(repository, null) != null); | ||||
Date date = JGitUtils.getLastChange(repository); | |||||
Date date = JGitUtils.getLastChange(repository).when; | |||||
repository.close(); | repository.close(); | ||||
assertNotNull("Could not get last repository change date!", date); | assertNotNull("Could not get last repository change date!", date); | ||||
} | } | ||||
assertNull(JGitUtils.getFirstCommit(repository, null)); | assertNull(JGitUtils.getFirstCommit(repository, null)); | ||||
assertEquals(folder.lastModified(), JGitUtils.getFirstChange(repository, null) | assertEquals(folder.lastModified(), JGitUtils.getFirstChange(repository, null) | ||||
.getTime()); | .getTime()); | ||||
assertEquals(folder.lastModified(), JGitUtils.getLastChange(repository).getTime()); | |||||
assertEquals(folder.lastModified(), JGitUtils.getLastChange(repository).when.getTime()); | |||||
assertNull(JGitUtils.getCommit(repository, null)); | assertNull(JGitUtils.getCommit(repository, null)); | ||||
repository.close(); | repository.close(); | ||||
RepositoryCache.close(repository); | RepositoryCache.close(repository); |