Skip to content

Commit dc434f9

Browse files
committed
Add a dfetch remove command
Fixes #26
1 parent 8cfe9ea commit dc434f9

5 files changed

Lines changed: 92 additions & 0 deletions

File tree

dfetch/__main__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import dfetch.commands.freeze
1818
import dfetch.commands.import_
1919
import dfetch.commands.init
20+
import dfetch.commands.remove
2021
import dfetch.commands.report
2122
import dfetch.commands.update
2223
import dfetch.commands.update_patch
@@ -52,6 +53,7 @@ def create_parser() -> argparse.ArgumentParser:
5253
dfetch.commands.freeze.Freeze.create_menu(subparsers)
5354
dfetch.commands.import_.Import.create_menu(subparsers)
5455
dfetch.commands.init.Init.create_menu(subparsers)
56+
dfetch.commands.remove.Remove.create_menu(subparsers)
5557
dfetch.commands.report.Report.create_menu(subparsers)
5658
dfetch.commands.update.Update.create_menu(subparsers)
5759
dfetch.commands.update_patch.UpdatePatch.create_menu(subparsers)

dfetch/commands/remove.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import argparse
2+
import os
3+
import shutil
4+
5+
import dfetch.commands.command
6+
from dfetch import DEFAULT_MANIFEST_NAME
7+
from dfetch.log import get_logger
8+
from dfetch.manifest.manifest import get_manifest
9+
from dfetch.util.util import in_directory, safe_rm
10+
11+
logger = get_logger(__name__)
12+
13+
14+
class Remove(dfetch.commands.command.Command):
15+
"""Remove a project from the manifest,
16+
17+
Backup manifest, and remove project directory from disk.
18+
"""
19+
20+
@staticmethod
21+
def create_menu(subparsers: dfetch.commands.command.SubparserActionType) -> None:
22+
"""Add the menu for the update action."""
23+
parser = dfetch.commands.command.Command.parser(subparsers, Remove)
24+
parser.add_argument(
25+
"projects",
26+
metavar="<project>",
27+
type=str,
28+
nargs="*",
29+
help="Specific project(s) to remove",
30+
)
31+
32+
def __call__(self, args: argparse.Namespace) -> None:
33+
"""Perform the remove action."""
34+
35+
manifest, path = get_manifest()
36+
37+
with in_directory(os.path.dirname(path)):
38+
for project in args.projects:
39+
40+
manifest.remove(project)
41+
logger.info(f"Project '{project}' removed from manifest.")
42+
43+
safe_rm(project)
44+
45+
shutil.move(DEFAULT_MANIFEST_NAME, DEFAULT_MANIFEST_NAME + ".backup")
46+
manifest.dump(path)

dfetch/manifest/manifest.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,14 @@ def selected_projects(self, names: Sequence[str]) -> Sequence[ProjectEntry]:
322322
self._check_all_names_found(names, projects)
323323
return projects
324324

325+
def remove(self, project_name: str) -> None:
326+
"""Remove a project from the manifest."""
327+
if project_name not in self._projects:
328+
possibles = [project.name for project in self._projects.values()]
329+
raise RequestedProjectNotFoundError(project_name, possibles)
330+
331+
del self._projects[project_name]
332+
325333
def _check_all_names_found(
326334
self, names: Sequence[str], projects: Sequence[ProjectEntry]
327335
) -> None:

features/remove-project.feature

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
Feature: Remove a project from the manifest
2+
3+
Scenario: Remove an existing project
4+
Given the manifest 'dfetch.yaml'
5+
"""
6+
manifest:
7+
version: '0.0'
8+
9+
projects:
10+
- name: ext/test-repo-tag
11+
url: https://github.com/dfetch-org/test-repo
12+
tag: v1
13+
14+
"""
15+
And all projects are updated
16+
When I run "dfetch remove ext/test-repo-tag"
17+
Then the manifest 'dfetch.yaml' is replaced with
18+
"""
19+
manifest:
20+
version: '0.0'
21+
22+
projects: []
23+
"""
24+
And the directory 'ext/test-repo-tag' should be removed from disk
25+
And the output shows
26+
"""
27+
Dfetch (0.10.0)
28+
ext/test-repo-tag: removed
29+
"""
30+

features/steps/generic_steps.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -457,3 +457,9 @@ def step_impl(context, path):
457457
assert expected_dir == actual_dir, os.linesep.join(
458458
["", "Expected:", expected_dir, "", "Actual:", actual_dir]
459459
)
460+
461+
462+
@then("the directory '{path' should be removed from disk")
463+
def step_impl(_, path):
464+
"""Check if a directory is removed."""
465+
assert not os.path.exists(path), f"Directory {path} still exists!"

0 commit comments

Comments
 (0)