Refactor reading and writing heads in Repository

Add private methods which are used for reading and writing MERGE_HEAD
and CHERRY_PICK_HEAD files, as suggested in the comments on change
I947967fdc2f1d55016c95106b104c2afcc9797a1.

Change-Id: If4617a05ee57054b8b1fcba36a06a641340ecc0e
Signed-off-by: Robin Stocker <robin@nibor.org>
This commit is contained in:
Robin Stocker 2011-04-06 21:10:16 +02:00
parent 6e10aa42e9
commit 3151657404
1 changed files with 47 additions and 40 deletions

View File

@ -1158,15 +1158,8 @@ public List<ObjectId> readMergeHeads() throws IOException, NoWorkTreeException {
if (isBare() || getDirectory() == null)
throw new NoWorkTreeException();
File mergeHeadFile = new File(getDirectory(), Constants.MERGE_HEAD);
byte[] raw;
try {
raw = IO.readFully(mergeHeadFile);
} catch (FileNotFoundException notFound) {
return null;
}
if (raw.length == 0)
byte[] raw = readGitDirectoryFile(Constants.MERGE_HEAD);
if (raw == null)
return null;
LinkedList<ObjectId> heads = new LinkedList<ObjectId>();
@ -1190,21 +1183,7 @@ public List<ObjectId> readMergeHeads() throws IOException, NoWorkTreeException {
* @throws IOException
*/
public void writeMergeHeads(List<ObjectId> heads) throws IOException {
File mergeHeadFile = new File(gitDir, Constants.MERGE_HEAD);
if (heads != null) {
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(mergeHeadFile));
try {
for (ObjectId id : heads) {
id.copyTo(bos);
bos.write('\n');
}
} finally {
bos.close();
}
} else {
FileUtils.delete(mergeHeadFile);
}
writeHeadsFile(heads, Constants.MERGE_HEAD);
}
/**
@ -1223,16 +1202,8 @@ public ObjectId readCherryPickHead() throws IOException,
if (isBare() || getDirectory() == null)
throw new NoWorkTreeException();
File mergeHeadFile = new File(getDirectory(),
Constants.CHERRY_PICK_HEAD);
byte[] raw;
try {
raw = IO.readFully(mergeHeadFile);
} catch (FileNotFoundException notFound) {
return null;
}
if (raw.length == 0)
byte[] raw = readGitDirectoryFile(Constants.CHERRY_PICK_HEAD);
if (raw == null)
return null;
return ObjectId.fromString(raw, 0);
@ -1248,18 +1219,54 @@ public ObjectId readCherryPickHead() throws IOException,
* @throws IOException
*/
public void writeCherryPickHead(ObjectId head) throws IOException {
File cherryPickHeadFile = new File(gitDir, Constants.CHERRY_PICK_HEAD);
if (head != null) {
List<ObjectId> heads = (head != null) ? Collections.singletonList(head)
: null;
writeHeadsFile(heads, Constants.CHERRY_PICK_HEAD);
}
/**
* Read a file from the git directory.
*
* @param filename
* @return the raw contents or null if the file doesn't exist or is empty
* @throws IOException
*/
private byte[] readGitDirectoryFile(String filename) throws IOException {
File file = new File(getDirectory(), filename);
try {
byte[] raw = IO.readFully(file);
return raw.length > 0 ? raw : null;
} catch (FileNotFoundException notFound) {
return null;
}
}
/**
* Write the given heads to a file in the git directory.
*
* @param heads
* a list of object ids to write or null if the file should be
* deleted.
* @param filename
* @throws FileNotFoundException
* @throws IOException
*/
private void writeHeadsFile(List<ObjectId> heads, String filename)
throws FileNotFoundException, IOException {
File headsFile = new File(getDirectory(), filename);
if (heads != null) {
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(cherryPickHeadFile));
new FileOutputStream(headsFile));
try {
head.copyTo(bos);
bos.write('\n');
for (ObjectId id : heads) {
id.copyTo(bos);
bos.write('\n');
}
} finally {
bos.close();
}
} else {
FileUtils.delete(cherryPickHeadFile, FileUtils.SKIP_MISSING);
FileUtils.delete(headsFile, FileUtils.SKIP_MISSING);
}
}
}