Detect missing paths in hg fileview command

If a not existing path is request in the fileview command, it will
be treated as an empty directory. But such a thing does not exist in hg.
Therefore we handle this result as what it is: a not existing path -
and we throw a not found exception.
This commit is contained in:
René Pfeuffer
2020-09-22 17:29:40 +02:00
parent fc534605f0
commit 059482f8ab
5 changed files with 43 additions and 18 deletions

View File

@@ -36,6 +36,9 @@ import sonia.scm.repository.spi.javahg.HgFileviewCommand;
import java.io.IOException;
import static sonia.scm.ContextEntry.ContextBuilder.entity;
import static sonia.scm.NotFoundException.notFound;
//~--- JDK imports ------------------------------------------------------------
/**
@@ -93,7 +96,8 @@ public class HgBrowseCommand extends AbstractCommand implements BrowseCommand
cmd.setLimit(request.getLimit());
cmd.setOffset(request.getOffset());
FileObject file = cmd.execute();
FileObject file = cmd.execute()
.orElseThrow(() -> notFound(entity("File", request.getPath()).in("Revision", revision).in(getRepository())));
return new BrowserResult(c == null? "tip": c.getNode(), revision, file);
}
}

View File

@@ -21,7 +21,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package sonia.scm.repository.spi.javahg;
//~--- non-JDK imports --------------------------------------------------------
@@ -29,12 +29,12 @@ package sonia.scm.repository.spi.javahg;
import com.aragost.javahg.Repository;
import com.aragost.javahg.internals.AbstractCommand;
import com.aragost.javahg.internals.HgInputStream;
import sonia.scm.repository.FileObject;
//~--- JDK imports ------------------------------------------------------------
import java.io.IOException;
import java.util.Optional;
/**
* Mercurial command to list files of a repository.
@@ -161,7 +161,7 @@ public class HgFileviewCommand extends AbstractCommand
*
* @throws IOException
*/
public FileObject execute() throws IOException
public Optional<FileObject> execute() throws IOException
{
cmdAppend("-t");

View File

@@ -21,7 +21,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package sonia.scm.repository.spi.javahg;
import com.aragost.javahg.DateTime;
@@ -35,6 +35,10 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Optional;
import static java.util.Optional.empty;
import static java.util.Optional.of;
class HgFileviewCommandResultReader {
@@ -48,7 +52,7 @@ class HgFileviewCommandResultReader {
this.disableLastCommit = disableLastCommit;
}
FileObject parseResult() throws IOException {
Optional<FileObject> parseResult() throws IOException {
Deque<FileObject> stack = new LinkedList<>();
FileObject last = null;
@@ -82,13 +86,17 @@ class HgFileviewCommandResultReader {
if (stack.isEmpty()) {
// if the stack is empty, the requested path is probably a file
return last;
return of(last);
} else if (stack.size() == 1 && stack.getFirst().isDirectory() && stack.getFirst().getChildren().isEmpty()) {
// There are no empty directories in hg. When we get this,
// we just get the requested path as a directory, but it does not exist.
return empty();
} else {
// if the stack is not empty, the requested path is a directory
if (stream.read() == TRUNCATED_MARK) {
stack.getLast().setTruncated(true);
}
return stack.getLast();
return of(stack.getLast());
}
}