Add REST endpoint to get the reflog of a branch
Change-Id: I9c0b3fa430b46762774bfa43710c3bb01fd2799e Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
This commit is contained in:
@@ -761,6 +761,77 @@ The content is returned as base64 encoded string.
|
||||
Ly8gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY...
|
||||
----
|
||||
|
||||
[[get-reflog]]
|
||||
=== Get Reflog
|
||||
--
|
||||
'GET /projects/link:#project-name[\{project-name\}]/branches/link:#branch-id[\{branch-id\}]/reflog'
|
||||
--
|
||||
|
||||
Gets the reflog of a certain branch.
|
||||
|
||||
The caller must be project owner.
|
||||
|
||||
.Request
|
||||
----
|
||||
GET /projects/gerrit/branches/master/reflog HTTP/1.0
|
||||
----
|
||||
|
||||
As response a list of link:#reflog-entry-info[ReflogEntryInfo] entities
|
||||
is returned that describe the reflog entries. The reflog entries are
|
||||
returned in reverse order.
|
||||
|
||||
.Response
|
||||
----
|
||||
HTTP/1.1 200 OK
|
||||
Content-Disposition: attachment
|
||||
Content-Type: application/json;charset=UTF-8
|
||||
|
||||
)]}'
|
||||
[
|
||||
{
|
||||
"old_id": "976ced8f4fc0909d7e1584d18455299545881d60",
|
||||
"new_id": "2eaa94bac536654eb592c941e33b91f925698d16",
|
||||
"who": {
|
||||
"name": "Jane Roe",
|
||||
"email": "jane.roe@example.com",
|
||||
"date": "2014-06-30 11:53:43.000000000",
|
||||
"tz": 120
|
||||
},
|
||||
"comment": "merged: fast forward"
|
||||
},
|
||||
{
|
||||
"old_id": "c271c6a7161b74f85560c5899c8c73ee89ca5e29",
|
||||
"new_id": "976ced8f4fc0909d7e1584d18455299545881d60",
|
||||
"who": {
|
||||
"name": "John Doe",
|
||||
"email": "john.doe@example.com",
|
||||
"date": "2013-10-02 10:45:26.000000000",
|
||||
"tz": 120
|
||||
},
|
||||
"comment": "merged: fast forward"
|
||||
},
|
||||
{
|
||||
"old_id": "0000000000000000000000000000000000000000",
|
||||
"new_id": "c271c6a7161b74f85560c5899c8c73ee89ca5e29",
|
||||
"who": {
|
||||
"name": "John Doe",
|
||||
"email": "john.doe@example.com",
|
||||
"date": "2013-09-30 19:08:44.000000000",
|
||||
"tz": 120
|
||||
},
|
||||
"comment": ""
|
||||
}
|
||||
]
|
||||
----
|
||||
|
||||
The get reflog endpoint also accepts a limit integer in the `n`
|
||||
parameter. This limits the results to show the last `n` reflog entries.
|
||||
|
||||
Query the last 25 reflog entries.
|
||||
----
|
||||
GET /projects/gerrit/branches/master/reflog?n=25 HTTP/1.0
|
||||
----
|
||||
|
||||
[[child-project-endpoints]]
|
||||
== Child Project Endpoints
|
||||
|
||||
@@ -1554,6 +1625,21 @@ Message that should be used to commit the change of the project parent
|
||||
in the `project.config` file to the `refs/meta/config` branch.
|
||||
|=============================
|
||||
|
||||
[[reflog-entry-info]]
|
||||
=== ReflogEntryInfo
|
||||
The `ReflogEntryInfo` entity describes an entry in a reflog.
|
||||
|
||||
[options="header",width="50%",cols="1,6"]
|
||||
|============================
|
||||
|Field Name |Description
|
||||
|`old_id` |The old commit ID.
|
||||
|`new_id` |The new commit ID.
|
||||
|`who` |
|
||||
The user performing the change as a
|
||||
link:rest-api-changes.html#git-person-info[GitPersonInfo] entity.
|
||||
|`comment` |Comment of the reflog entry.
|
||||
|============================
|
||||
|
||||
[[repository-statistics-info]]
|
||||
=== RepositoryStatisticsInfo
|
||||
The `RepositoryStatisticsInfo` entity contains information about
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
// Copyright (C) 2014 The Android Open Source Project
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package com.google.gerrit.server.project;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.gerrit.extensions.common.GitPerson;
|
||||
import com.google.gerrit.extensions.restapi.AuthException;
|
||||
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
|
||||
import com.google.gerrit.extensions.restapi.RestReadView;
|
||||
import com.google.gerrit.server.git.GitRepositoryManager;
|
||||
import com.google.inject.Inject;
|
||||
|
||||
import org.eclipse.jgit.errors.RepositoryNotFoundException;
|
||||
import org.eclipse.jgit.lib.PersonIdent;
|
||||
import org.eclipse.jgit.lib.ReflogEntry;
|
||||
import org.eclipse.jgit.lib.ReflogReader;
|
||||
import org.eclipse.jgit.lib.Repository;
|
||||
import org.kohsuke.args4j.Option;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.sql.Timestamp;
|
||||
import java.util.List;
|
||||
|
||||
public class GetReflog implements RestReadView<BranchResource> {
|
||||
private final GitRepositoryManager repoManager;
|
||||
|
||||
@Option(name = "--limit", aliases = {"-n"}, metaVar = "CNT",
|
||||
usage = "maximum number of reflog entries to list")
|
||||
public GetReflog setLimit(int limit) {
|
||||
this.limit = limit;
|
||||
return this;
|
||||
}
|
||||
|
||||
private int limit;
|
||||
|
||||
@Inject
|
||||
public GetReflog(GitRepositoryManager repoManager) {
|
||||
this.repoManager = repoManager;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ReflogEntryInfo> apply(BranchResource rsrc) throws AuthException,
|
||||
ResourceNotFoundException, RepositoryNotFoundException, IOException {
|
||||
if (!rsrc.getControl().isOwner()) {
|
||||
throw new AuthException("no project owner");
|
||||
}
|
||||
|
||||
Repository repo = repoManager.openRepository(rsrc.getNameKey());
|
||||
try {
|
||||
ReflogReader r = repo.getReflogReader(rsrc.getRef());
|
||||
if (r == null) {
|
||||
throw new ResourceNotFoundException(rsrc.getRef());
|
||||
}
|
||||
List<ReflogEntry> entries =
|
||||
limit > 0 ? r.getReverseEntries(limit) : r.getReverseEntries();
|
||||
return Lists.transform(entries, new Function<ReflogEntry, ReflogEntryInfo>() {
|
||||
@Override
|
||||
public ReflogEntryInfo apply(ReflogEntry e) {
|
||||
return new ReflogEntryInfo(e);
|
||||
}});
|
||||
} finally {
|
||||
repo.close();
|
||||
}
|
||||
}
|
||||
|
||||
public static class ReflogEntryInfo {
|
||||
public String oldId;
|
||||
public String newId;
|
||||
public GitPerson who;
|
||||
public String comment;
|
||||
|
||||
public ReflogEntryInfo(ReflogEntry e) {
|
||||
oldId = e.getOldId().getName();
|
||||
newId = e.getNewId().getName();
|
||||
|
||||
PersonIdent ident = e.getWho();
|
||||
who = new GitPerson();
|
||||
who.name = ident.getName();
|
||||
who.email = ident.getEmailAddress();
|
||||
who.date = new Timestamp(ident.getWhen().getTime());
|
||||
who.tz = ident.getTimeZoneOffset();
|
||||
|
||||
comment = e.getComment();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -59,6 +59,7 @@ public class Module extends RestApiModule {
|
||||
get(BRANCH_KIND).to(GetBranch.class);
|
||||
delete(BRANCH_KIND).to(DeleteBranch.class);
|
||||
install(new FactoryModuleBuilder().build(CreateBranch.Factory.class));
|
||||
get(BRANCH_KIND, "reflog").to(GetReflog.class);
|
||||
child(BRANCH_KIND, "files").to(FilesCollection.class);
|
||||
get(FILE_KIND, "content").to(GetContent.class);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user