From 440c90be2490af0b6754eb19a089f7f896fd8286 Mon Sep 17 00:00:00 2001
From: Brian Tiger Chow <brian.holderchow@gmail.com>
Date: Thu, 6 Nov 2014 04:41:22 -0800
Subject: [PATCH] extract unpin

@mappum
---
 core/commands2/pin.go | 56 +++++++++++++++++++++++++------------------
 1 file changed, 33 insertions(+), 23 deletions(-)

diff --git a/core/commands2/pin.go b/core/commands2/pin.go
index 5ef9034ea..4a43fa96c 100644
--- a/core/commands2/pin.go
+++ b/core/commands2/pin.go
@@ -1,11 +1,11 @@
 package commands
 
 import (
-	"errors"
 	"fmt"
 
 	cmds "github.com/jbenet/go-ipfs/commands"
 	"github.com/jbenet/go-ipfs/core"
+	"github.com/jbenet/go-ipfs/core/commands2/internal"
 	"github.com/jbenet/go-ipfs/merkledag"
 )
 
@@ -37,7 +37,7 @@ var pinCmd = &cmds.Command{
 			}
 		}*/
 
-		paths, err := toStrings(req.Arguments())
+		paths, err := internal.ToStrings(req.Arguments())
 		if err != nil {
 			res.SetError(err, cmds.ErrNormal)
 			return
@@ -66,28 +66,13 @@ var unpinCmd = &cmds.Command{
 		opt, _ := req.Option("recursive")
 		recursive, _ := opt.(bool) // false if cast fails.
 
-		for _, arg := range req.Arguments() {
-			path, ok := arg.(string)
-			if !ok {
-				res.SetError(errors.New("cast error"), cmds.ErrNormal)
-				return
-			}
-
-			dagnode, err := n.Resolver.ResolvePath(path)
-			if err != nil {
-				res.SetError(fmt.Errorf("pin error: %v", err), cmds.ErrNormal)
-				return
-			}
-
-			k, _ := dagnode.Key()
-			err = n.Pinning.Unpin(k, recursive)
-			if err != nil {
-				res.SetError(fmt.Errorf("pin: %v", err), cmds.ErrNormal)
-				return
-			}
+		paths, err := internal.ToStrings(req.Arguments())
+		if err != nil {
+			res.SetError(err, cmds.ErrNormal)
+			return
 		}
 
-		err := n.Pinning.Flush()
+		_, err = unpin(n, paths, recursive)
 		if err != nil {
 			res.SetError(err, cmds.ErrNormal)
 		}
@@ -100,7 +85,6 @@ func pin(n *core.IpfsNode, paths []string, recursive bool) ([]*merkledag.Node, e
 
 	dagnodes := make([]*merkledag.Node, 0)
 	for _, path := range paths {
-
 		dagnode, err := n.Resolver.ResolvePath(path)
 		if err != nil {
 			return nil, fmt.Errorf("pin error: %v", err)
@@ -122,3 +106,29 @@ func pin(n *core.IpfsNode, paths []string, recursive bool) ([]*merkledag.Node, e
 
 	return dagnodes, nil
 }
+
+func unpin(n *core.IpfsNode, paths []string, recursive bool) ([]*merkledag.Node, error) {
+
+	dagnodes := make([]*merkledag.Node, 0)
+	for _, path := range paths {
+		dagnode, err := n.Resolver.ResolvePath(path)
+		if err != nil {
+			return nil, err
+		}
+		dagnodes = append(dagnodes, dagnode)
+	}
+
+	for _, dagnode := range dagnodes {
+		k, _ := dagnode.Key()
+		err := n.Pinning.Unpin(k, recursive)
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	err := n.Pinning.Flush()
+	if err != nil {
+		return nil, err
+	}
+	return dagnodes, nil
+}
-- 
GitLab