Skip to content

Commit 17dcba8

Browse files
authored
feat: simplify finalize options (#58)
This change removes the revert and clean options. This simplifies the overall API: finalize never touches the worktree.
1 parent 70a0586 commit 17dcba8

File tree

4 files changed

+5
-163
lines changed

4 files changed

+5
-163
lines changed

docs/git-draft.adoc

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ IMPORTANT: `git-draft` is WIP.
1919

2020
[verse]
2121
git draft [options] [--generate] [--bot BOT] [--edit] [--reset | --no-reset] [--sync] [TEMPLATE [VARIABLE...]]
22-
git draft [options] --finalize [--clean | --revert] [--delete]
22+
git draft [options] --finalize [--delete]
2323
git draft [options] --show-drafts [--json]
2424
git draft [options] --show-prompts [--json] [PROMPT]
2525
git draft [options] --show-templates [--json | [--edit] TEMPLATE]
@@ -36,10 +36,6 @@ git draft [options] --show-templates [--json | [--edit] TEMPLATE]
3636
--bot=BOT::
3737
Bot name.
3838

39-
-c::
40-
--clean::
41-
TODO
42-
4339
-d::
4440
--delete::
4541
Delete finalized branch.
@@ -71,10 +67,6 @@ git draft [options] --show-templates [--json | [--edit] TEMPLATE]
7167
--no-reset::
7268
TODO
7369

74-
-r::
75-
--revert::
76-
Abandon any changes since draft creation.
77-
7870
--root::
7971
Repository search root.
8072

src/git_draft/__main__.py

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,6 @@ def callback(
7070
dest="bot",
7171
help="bot name",
7272
)
73-
parser.add_option(
74-
"-c",
75-
"--clean",
76-
help="remove deleted files from work directory",
77-
action="store_true",
78-
)
7973
parser.add_option(
8074
"-d",
8175
"--delete",
@@ -94,12 +88,6 @@ def callback(
9488
help="use JSON for table output",
9589
action="store_true",
9690
)
97-
parser.add_option(
98-
"-r",
99-
"--revert",
100-
help="abandon any changes since draft creation",
101-
action="store_true",
102-
)
10391
parser.add_option(
10492
"-s",
10593
"--sync",
@@ -218,11 +206,8 @@ def main() -> None: # noqa: PLR0912 PLR0915
218206
)
219207
print(f"Refined {name}.")
220208
elif command == "finalize":
221-
name = drafter.exit_draft(
222-
revert=opts.revert, clean=opts.clean, delete=opts.delete
223-
)
224-
verb = "Reverted" if opts.revert else "Finalized"
225-
print(f"{verb} {name}.")
209+
name = drafter.finalize_draft(delete=opts.delete)
210+
print(f"Finalized {name}.")
226211
elif command == "show-drafts":
227212
table = drafter.history_table(args[0] if args else None)
228213
if table:

src/git_draft/drafter.py

Lines changed: 1 addition & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77
from datetime import datetime
88
import json
99
import logging
10-
import os
11-
import os.path as osp
1210
from pathlib import PurePosixPath
1311
import re
1412
from re import Match
@@ -175,9 +173,7 @@ def generate_draft( # noqa: PLR0913
175173
_logger.info("Completed generation for %s.", branch)
176174
return str(branch)
177175

178-
def exit_draft(
179-
self, *, revert: bool, clean: bool = False, delete: bool = False
180-
) -> str:
176+
def finalize_draft(self, *, delete: bool = False) -> str:
181177
branch = _Branch.active(self._repo)
182178
if not branch:
183179
raise RuntimeError("Not currently on a draft branch")
@@ -190,53 +186,13 @@ def exit_draft(
190186
raise RuntimeError("Unrecognized draft branch")
191187
[(origin_branch, origin_sha, sync_sha)] = rows
192188

193-
if (
194-
revert
195-
and sync_sha
196-
and self._repo.commit(origin_branch).hexsha != origin_sha
197-
):
198-
raise RuntimeError("Parent branch has moved, please rebase first")
199-
200-
if clean and not revert:
201-
# We delete files which have been deleted in the draft manually,
202-
# otherwise they would still show up as untracked.
203-
origin_delta = self._delta(f"{origin_branch}..{branch}")
204-
deleted = self._untracked() & origin_delta.deleted
205-
for path in deleted:
206-
os.remove(osp.join(self._repo.working_dir, path))
207-
_logger.info("Cleaned up files. [deleted=%s]", deleted)
208-
209189
# We do a small dance to move back to the original branch, keeping the
210190
# draft branch untouched. See https://stackoverflow.com/a/15993574 for
211191
# the inspiration.
212192
self._repo.git.checkout(detach=True)
213193
self._repo.git.reset("-N", origin_branch)
214194
self._repo.git.checkout(origin_branch)
215195

216-
if revert:
217-
# We revert the relevant files if needed. If a sync commit had been
218-
# created, we simply revert to it. Otherwise we compute which files
219-
# have changed due to draft commits and revert only those.
220-
if sync_sha:
221-
delta = self._delta(sync_sha)
222-
if delta.changed:
223-
self._repo.git.checkout(sync_sha, "--", ".")
224-
_logger.info("Reverted to sync commit. [sha=%s]", sync_sha)
225-
else:
226-
origin_delta = self._delta(f"{origin_branch}..{branch}")
227-
head_delta = self._delta("HEAD")
228-
changed = head_delta.touched & origin_delta.changed
229-
if changed:
230-
self._repo.git.checkout("--", *changed)
231-
deleted = head_delta.touched & origin_delta.deleted
232-
if deleted:
233-
self._repo.git.rm("--", *deleted)
234-
_logger.info(
235-
"Reverted touched files. [changed=%s, deleted=%s]",
236-
changed,
237-
deleted,
238-
)
239-
240196
if delete:
241197
self._repo.git.branch("-D", branch.name)
242198
_logger.debug("Deleted branch %s.", branch)

tests/git_draft/drafter_test.py

Lines changed: 1 addition & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,6 @@ def act(self, _goal: Goal, toolbox: Toolbox) -> Action:
7070
self._drafter.generate_draft("hello", CustomBot())
7171
assert self._commit_files("HEAD") == set(["p2", "p3"])
7272

73-
def test_generate_then_revert_draft(self) -> None:
74-
self._drafter.generate_draft("hello", FakeBot())
75-
self._drafter.exit_draft(revert=True)
76-
assert len(self._commits()) == 1
77-
7873
def test_generate_outside_branch(self) -> None:
7974
self._repo.git.checkout("--detach")
8075
with pytest.raises(RuntimeError):
@@ -140,98 +135,12 @@ def act(self, _goal: Goal, toolbox: Toolbox) -> Action:
140135

141136
self._drafter.generate_draft("hello", CustomBot())
142137

143-
def test_sync_delete_revert(self) -> None:
144-
self._write("p1", "a")
145-
self._repo.git.add(all=True)
146-
self._repo.index.commit("advance")
147-
self._delete("p1")
148-
149-
class CustomBot(Bot):
150-
def act(self, _goal: Goal, toolbox: Toolbox) -> Action:
151-
toolbox.write_file(PurePosixPath("p2"), "b")
152-
return Action()
153-
154-
self._drafter.generate_draft("hello", CustomBot(), sync=True)
155-
assert self._read("p1") is None
156-
157-
self._drafter.exit_draft(revert=True)
158-
assert self._read("p1") is None
159-
160-
def test_generate_delete_finalize_clean(self) -> None:
161-
self._write("p1", "a")
162-
self._repo.git.add(all=True)
163-
self._repo.index.commit("advance")
164-
165-
class CustomBot(Bot):
166-
def act(self, _goal: Goal, toolbox: Toolbox) -> Action:
167-
toolbox.delete_file(PurePosixPath("p1"))
168-
return Action()
169-
170-
self._drafter.generate_draft("hello", CustomBot())
171-
assert self._read("p1") == "a"
172-
173-
self._drafter.exit_draft(revert=False, clean=True)
174-
assert self._read("p1") is None
175-
176-
def test_revert_outside_draft(self) -> None:
177-
with pytest.raises(RuntimeError):
178-
self._drafter.exit_draft(revert=True)
179-
180-
def test_revert_after_branch_move(self) -> None:
181-
self._write("log", "11")
182-
self._drafter.generate_draft("hi", FakeBot(), sync=True)
183-
branch = self._repo.active_branch
184-
self._repo.git.checkout("main")
185-
self._repo.index.commit("advance")
186-
self._repo.git.checkout(branch)
187-
with pytest.raises(RuntimeError):
188-
self._drafter.exit_draft(revert=True)
189-
190-
def test_revert_restores_worktree(self) -> None:
191-
self._write("p1.txt", "a1")
192-
self._write("p2.txt", "b1")
193-
self._drafter.generate_draft("hello", FakeBot(), sync=True)
194-
self._write("p1.txt", "a2")
195-
self._drafter.exit_draft(revert=True, delete=True)
196-
assert self._read("p1.txt") == "a1"
197-
assert self._read("p2.txt") == "b1"
198-
199-
def test_revert_discards_unused_files(self) -> None:
200-
self._drafter.generate_draft("hello", FakeBot())
201-
assert self._read("PROMPT") is None
202-
self._drafter.exit_draft(revert=True)
203-
assert self._read("PROMPT") is None
204-
205-
def test_revert_keeps_untouched_files(self) -> None:
206-
class CustomBot(Bot):
207-
def act(self, _goal: Goal, toolbox: Toolbox) -> Action:
208-
toolbox.write_file(PurePosixPath("p2.txt"), "t2")
209-
toolbox.write_file(PurePosixPath("p4.txt"), "t2")
210-
return Action()
211-
212-
self._write("p1.txt", "t0")
213-
self._write("p2.txt", "t0")
214-
self._repo.git.add(all=True)
215-
self._repo.index.commit("update")
216-
self._write("p1.txt", "t1")
217-
self._write("p2.txt", "t1")
218-
self._write("p3.txt", "t1")
219-
self._drafter.generate_draft("hello", CustomBot())
220-
self._write("p1.txt", "t3")
221-
self._write("p2.txt", "t3")
222-
self._drafter.exit_draft(revert=True)
223-
224-
assert self._read("p1.txt") == "t3"
225-
assert self._read("p2.txt") == "t0"
226-
assert self._read("p3.txt") == "t1"
227-
assert self._read("p4.txt") is None
228-
229138
def test_finalize_keeps_changes(self) -> None:
230139
self._write("p1.txt", "a1")
231140
self._drafter.generate_draft("hello", FakeBot())
232141
self._checkout()
233142
self._write("p1.txt", "a2")
234-
self._drafter.exit_draft(revert=False)
143+
self._drafter.finalize_draft()
235144
assert self._read("p1.txt") == "a2"
236145
assert self._read("PROMPT") == "hello"
237146

0 commit comments

Comments
 (0)