Skip to content

Commit 892227c

Browse files
authored
Fixing some issues with Git file system (#3079)
1 parent 056de65 commit 892227c

File tree

5 files changed

+50
-14
lines changed

5 files changed

+50
-14
lines changed

lib/livebook/file_system/git.ex

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,13 @@ defimpl Livebook.FileSystem, for: Livebook.FileSystem.Git do
116116

117117
def write_stream_halt(_file_system, _state), do: raise("not implemented")
118118

119-
def read_stream_into(_file_system, _path, _collectable), do: raise("not implemented")
119+
def read_stream_into(file_system, path, collectable) do
120+
try do
121+
Git.Client.stream_file(file_system, path, collectable)
122+
rescue
123+
error in File.Error -> FileSystem.Utils.posix_error(error.reason)
124+
end
125+
end
120126

121127
def load(file_system, %{"hub_id" => _} = fields) do
122128
load(file_system, %{

lib/livebook/file_system/git/client.ex

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,20 @@ defmodule Livebook.FileSystem.Git.Client do
4343
path = relative_path(path)
4444

4545
with {:ok, git_dir} <- fetch_repository(file_system) do
46-
show(git_dir, file_system.branch, path)
46+
git(git_dir, ["show", "#{file_system.branch}:#{path}"])
47+
end
48+
end
49+
50+
@doc """
51+
Streams the content of the given file from given repository.
52+
"""
53+
@spec stream_file(FileSystem.Git.t(), String.t(), Collectable.t()) ::
54+
{:ok, String.t()} | {:error, FileSystem.error()}
55+
def stream_file(%FileSystem.Git{} = file_system, path, collectable) do
56+
path = relative_path(path)
57+
58+
with {:ok, git_dir} <- fetch_repository(file_system) do
59+
git(git_dir, ["show", "#{file_system.branch}:#{path}"], into: collectable)
4760
end
4861
end
4962

@@ -90,10 +103,6 @@ defmodule Livebook.FileSystem.Git.Client do
90103
end
91104
end
92105

93-
defp show(git_dir, branch, path) do
94-
git(git_dir, ["show", "#{branch}:#{path}"])
95-
end
96-
97106
defp rev_parse(git_dir, branch, path) do
98107
with {:ok, etag} <- git(git_dir, ["rev-parse", "#{branch}:#{path}"]) do
99108
{:ok, String.trim(etag)}

lib/livebook_web/live/file_select_component.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -499,8 +499,8 @@ defmodule LivebookWeb.FileSelectComponent do
499499

500500
def handle_event("set_file_system", %{"id" => file_system_id}, socket) do
501501
file_system = Enum.find(socket.assigns.file_systems, &(&1.id == file_system_id))
502-
503502
file = FileSystem.File.new(file_system)
503+
:ok = FileSystem.mount(file_system)
504504

505505
send_event(socket.assigns.target, {:set_file, file, %{exists: true}})
506506

test/livebook/file_system/git_test.exs

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ defmodule Livebook.FileSystem.GitTest do
5151

5252
describe "FileSystem.read/2" do
5353
@describetag init: true
54+
5455
test "returns an error when a nonexistent key is given", %{file_system: file_system} do
5556
assert FileSystem.read(file_system, "/another_file.txt") ==
5657
{:error, "fatal: path 'another_file.txt' does not exist in 'main'"}
@@ -104,6 +105,7 @@ defmodule Livebook.FileSystem.GitTest do
104105

105106
describe "FileSystem.etag_for/2" do
106107
@describetag init: true
108+
107109
test "returns an error when a nonexistent key is given", %{file_system: file_system} do
108110
assert {:error, reason} = FileSystem.etag_for(file_system, "/another_file.txt")
109111
assert reason =~ "path 'another_file.txt' does not exist in 'main'"
@@ -116,6 +118,7 @@ defmodule Livebook.FileSystem.GitTest do
116118

117119
describe "FileSystem.exists?/2" do
118120
@describetag init: true
121+
119122
test "returns valid response", %{file_system: file_system} do
120123
assert {:ok, true} = FileSystem.exists?(file_system, "/file.txt")
121124
assert {:ok, false} = FileSystem.exists?(file_system, "/another_file.txt")
@@ -158,10 +161,27 @@ defmodule Livebook.FileSystem.GitTest do
158161
end
159162

160163
describe "FileSystem.read_stream_into/2" do
161-
test "not implemented", %{file_system: file_system} do
162-
assert_raise RuntimeError, "not implemented", fn ->
163-
FileSystem.read_stream_into(file_system, "/file.txt", <<>>)
164-
end
164+
@describetag init: true
165+
166+
test "returns an error when a nonexistent key is given", %{file_system: file_system} do
167+
assert FileSystem.read_stream_into(file_system, "/another_file.txt", <<>>) ==
168+
{:error, "fatal: path 'another_file.txt' does not exist in 'main'"}
169+
end
170+
171+
test "returns object contents under the given key", %{file_system: file_system} do
172+
assert {:ok, content} = FileSystem.read_stream_into(file_system, "/file.txt", <<>>)
173+
assert content =~ "git file storage works"
174+
end
175+
176+
@tag :tmp_dir
177+
test "collects file contents into another file", %{file_system: file_system, tmp_dir: tmp_dir} do
178+
file_path = Path.join(tmp_dir, "myfile.txt")
179+
collectable = FileSystem.File.new(FileSystem.Local.new(), file_path)
180+
181+
assert {:ok, %FileSystem.File{path: ^file_path}} =
182+
FileSystem.read_stream_into(file_system, "/file.txt", collectable)
183+
184+
assert File.read!(file_path) =~ "git file storage works"
165185
end
166186
end
167187

test/support/integration/teams_rpc.ex

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,13 @@ defmodule Livebook.TeamsRPC do
9898
hub_id: team.id
9999
}
100100

101-
attrs = %{
101+
attrs = [
102102
name: name,
103103
type: String.to_atom(type),
104104
value: Livebook.HubHelpers.generate_file_system_json(team, file_system),
105-
org_key: org_key
106-
}
105+
org_key: org_key,
106+
livebook_version: Livebook.Config.app_version()
107+
]
107108

108109
external_id = :erpc.call(node, TeamsRPC, :create_file_system, [attrs]).id
109110
Map.replace!(file_system, :external_id, to_string(external_id))

0 commit comments

Comments
 (0)