From de6a6e3e44eff6aa61ccf1586b3926929f16c794 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C5=81ukasz=20Magiera?= <magik6k@gmail.com>
Date: Mon, 23 Jul 2018 17:37:33 +0200
Subject: [PATCH] path: simplify ResolveToLastNode
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

License: MIT
Signed-off-by: Ɓukasz Magiera <magik6k@gmail.com>
---
 path/resolver/resolver.go | 46 +++++++++++++++++++++++----------------
 1 file changed, 27 insertions(+), 19 deletions(-)

diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go
index e7a95a83e..7bd8caff9 100644
--- a/path/resolver/resolver.go
+++ b/path/resolver/resolver.go
@@ -70,33 +70,41 @@ func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (ipld
 
 	for len(p) > 0 {
 		lnk, rest, err := r.ResolveOnce(ctx, r.DAG, nd, p)
-		if lnk != nil {
-			if err != nil {
-				return nil, nil, err
-			}
-
-			next, err := lnk.GetNode(ctx, r.DAG)
-			if err != nil {
-				return nil, nil, err
-			}
-			nd = next
-			p = rest
-			continue
+		if lnk == nil {
+			break
 		}
 
-		val, rest, err := nd.Resolve(p)
 		if err != nil {
 			return nil, nil, err
 		}
-		switch val.(type) {
-		case *ipld.Link:
-			return nil, nil, errors.New("inconsistent ResolveOnce / nd.Resolve")
-		default:
-			return nd, p, nil
+
+		next, err := lnk.GetNode(ctx, r.DAG)
+		if err != nil {
+			return nil, nil, err
 		}
+		nd = next
+		p = rest
 	}
 
-	return nd, nil, nil
+	if len(p) == 0 {
+		return nd, nil, nil
+	}
+
+	// Confirm the path exists within the object
+	val, rest, err := nd.Resolve(p)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	if len(rest) > 0 {
+		return nil, nil, errors.New("path failed to resolve fully")
+	}
+	switch val.(type) {
+	case *ipld.Link:
+		return nil, nil, errors.New("inconsistent ResolveOnce / nd.Resolve")
+	default:
+		return nd, p, nil
+	}
 }
 
 // ResolvePath fetches the node for given path. It returns the last item