Worktree.Add: Support Add deleted files, fixes #571 (#577)

diff --git a/worktree_commit_test.go b/worktree_commit_test.go
index f6744bc..09360af 100644
--- a/worktree_commit_test.go
+++ b/worktree_commit_test.go
@@ -99,6 +99,42 @@
 	assertStorageStatus(c, s.Repository, 13, 11, 10, expected)
 }
 
+func (s *WorktreeSuite) TestRemoveAndCommitAll(c *C) {
+	expected := plumbing.NewHash("907cd576c6ced2ecd3dab34a72bf9cf65944b9a9")
+
+	fs := memfs.New()
+	w := &Worktree{
+		r:          s.Repository,
+		Filesystem: fs,
+	}
+
+	err := w.Checkout(&CheckoutOptions{})
+	c.Assert(err, IsNil)
+
+	util.WriteFile(fs, "foo", []byte("foo"), 0644)
+	_, err = w.Add("foo")
+	c.Assert(err, IsNil)
+
+	_, errFirst := w.Commit("Add in Repo\n", &CommitOptions{
+		Author: defaultSignature(),
+	})
+	c.Assert(errFirst, IsNil)
+
+	errRemove := fs.Remove("foo")
+	c.Assert(errRemove, IsNil)
+
+	hash, errSecond := w.Commit("Remove foo\n", &CommitOptions{
+		All:    true,
+		Author: defaultSignature(),
+	})
+	c.Assert(errSecond, IsNil)
+
+	c.Assert(hash, Equals, expected)
+	c.Assert(err, IsNil)
+
+	assertStorageStatus(c, s.Repository, 13, 11, 11, expected)
+}
+
 func assertStorageStatus(
 	c *C, r *Repository,
 	treesCount, blobCount, commitCount int, head plumbing.Hash,
diff --git a/worktree_status.go b/worktree_status.go
index 24d0534..b2848f9 100644
--- a/worktree_status.go
+++ b/worktree_status.go
@@ -252,6 +252,9 @@
 
 	h, err := w.copyFileToStorage(path)
 	if err != nil {
+		if os.IsNotExist(err) {
+			h, err = w.deleteFromIndex(path)
+		}
 		return h, err
 	}
 
diff --git a/worktree_test.go b/worktree_test.go
index 1eb305d..7d9c617 100644
--- a/worktree_test.go
+++ b/worktree_test.go
@@ -372,7 +372,11 @@
 
 	modFilename := norm.Form(norm.NFKD).String(filename)
 	util.WriteFile(w.Filesystem, modFilename, []byte("foo"), 0755)
+
 	_, err = w.Add(filename)
+	c.Assert(err, IsNil)
+	_, err = w.Add(modFilename)
+	c.Assert(err, IsNil)
 
 	status, err = w.Status()
 	c.Assert(err, IsNil)