Set the GIT_DIR/description file during gerrit create-project

Otherwise the initial description of the project won't appear in
the gitweb description file, which may confuse users who rely on
the local gitweb installation to examine repositories.

Signed-off-by: Shawn O. Pearce <sop@google.com>
CC: Ulrik Sjölin <ulrik.sjolin@gmail.com>
This commit is contained in:
Shawn O. Pearce
2009-08-12 12:32:36 -07:00
parent 9020176341
commit c05b9bc1e6
3 changed files with 47 additions and 29 deletions

View File

@@ -21,8 +21,12 @@ import com.google.gerrit.server.config.SitePath;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.spearce.jgit.errors.RepositoryNotFoundException;
import org.spearce.jgit.lib.Config;
import org.spearce.jgit.lib.Constants;
import org.spearce.jgit.lib.LockFile;
import org.spearce.jgit.lib.PersonIdent;
import org.spearce.jgit.lib.Repository;
import org.spearce.jgit.lib.RepositoryCache;
@@ -35,6 +39,7 @@ import java.io.IOException;
/** Global server-side state for Gerrit. */
@Singleton
public class GerritServer {
private static final Logger log = LoggerFactory.getLogger(GerritServer.class);
private final File sitePath;
private final Config gerritConfigFile;
private final File basepath;
@@ -124,6 +129,45 @@ public class GerritServer {
}
}
/**
* Set the {@code GIT_DIR/description} file for gitweb.
* <p>
* NB: This code should really be in JGit, as a member of the Repostiory
* object. Until it moves there, its here.
*
* @param name the repository name, relative to the base directory.
* @param description new description text for the repository.
*/
public void setProjectDescription(final String name, final String description) {
// Update git's description file, in case gitweb is being used
//
try {
final Repository e;
final LockFile f;
e = openRepository(name);
f = new LockFile(new File(e.getDirectory(), "description"));
if (f.lock()) {
String d = description;
if (d != null) {
d = d.trim();
if (d.length() > 0) {
d += "\n";
}
} else {
d = "";
}
f.write(Constants.encode(d));
f.commit();
}
e.close();
} catch (RepositoryNotFoundException e) {
log.error("Cannot update description for " + name, e);
} catch (IOException e) {
log.error("Cannot update description for " + name, e);
}
}
private boolean isUnreasonableName(final String name) {
if (name.length() == 0) return true; // no empty paths

View File

@@ -47,7 +47,6 @@ import org.spearce.jgit.errors.IncorrectObjectTypeException;
import org.spearce.jgit.errors.MissingObjectException;
import org.spearce.jgit.errors.RepositoryNotFoundException;
import org.spearce.jgit.lib.Constants;
import org.spearce.jgit.lib.LockFile;
import org.spearce.jgit.lib.ObjectId;
import org.spearce.jgit.lib.Ref;
import org.spearce.jgit.lib.RefUpdate;
@@ -55,7 +54,6 @@ import org.spearce.jgit.lib.Repository;
import org.spearce.jgit.revwalk.ObjectWalk;
import org.spearce.jgit.revwalk.RevCommit;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
@@ -155,33 +153,8 @@ class ProjectAdminServiceImpl extends BaseServiceImplementation implements
projectCache.evict(proj);
if (!wildProject.equals(projectName)) {
// Update git's description file, in case gitweb is being used
//
try {
final Repository e;
final LockFile f;
e = server.openRepository(proj.getName());
f = new LockFile(new File(e.getDirectory(), "description"));
if (f.lock()) {
String d = proj.getDescription();
if (d != null) {
d = d.trim();
if (d.length() > 0) {
d += "\n";
}
} else {
d = "";
}
f.write(Constants.encode(d));
f.commit();
}
e.close();
} catch (RepositoryNotFoundException e) {
log.error("Cannot update description for " + proj.getName(), e);
} catch (IOException e) {
log.error("Cannot update description for " + proj.getName(), e);
}
server.setProjectDescription(projectName.get(), update
.getDescription());
}
try {

View File

@@ -93,6 +93,7 @@ final class AdminCreateProject extends BaseCommand {
Repository repo = gs.createRepository(projectName);
repo.create(true);
gs.setProjectDescription(projectName, projectDescription);
txn.commit();