easy-worktree 0.1.3__tar.gz → 0.1.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: easy-worktree
3
- Version: 0.1.3
3
+ Version: 0.1.5
4
4
  Summary: Git worktree を簡単に管理するための CLI ツール
5
5
  Project-URL: Homepage, https://github.com/igtm/easy-worktree
6
6
  Project-URL: Repository, https://github.com/igtm/easy-worktree
@@ -28,8 +28,8 @@ MESSAGES = {
28
28
  "ja": "使用方法: wt clone <repository_url>",
29
29
  },
30
30
  "usage_add": {
31
- "en": "Usage: wt add (ad) <work_name> [<base_branch>]",
32
- "ja": "使用方法: wt add (ad) <作業名> [<base_branch>]",
31
+ "en": "Usage: wt add (ad) <work_name> [<base_branch>] [--no-setup] [--select]",
32
+ "ja": "使用方法: wt add (ad) <作業名> [<base_branch>] [--no-setup] [--select]",
33
33
  },
34
34
  "usage_rm": {"en": "Usage: wt rm <work_name>", "ja": "使用方法: wt rm <作業名>"},
35
35
  "base_not_found": {
@@ -340,7 +340,7 @@ def create_hook_template(base_dir: Path):
340
340
  # .gitignore
341
341
  gitignore_file = wt_dir / ".gitignore"
342
342
 
343
- ignores = ["post-add.local", "config.local.toml"]
343
+ ignores = ["post-add.local", "config.local.toml", "last_selection"]
344
344
 
345
345
  if not gitignore_file.exists():
346
346
  gitignore_content = "\n".join(ignores) + "\n"
@@ -855,7 +855,7 @@ def add_worktree(
855
855
 
856
856
 
857
857
  def cmd_add(args: list[str]):
858
- """wt add <work_name> [<base_branch>] [--skip-setup] - Add a worktree"""
858
+ """wt add <work_name> [<base_branch>] [--no-setup] [--select] - Add a worktree"""
859
859
  if len(args) < 1:
860
860
  print(msg("usage_add"), file=sys.stderr)
861
861
  sys.exit(1)
@@ -863,10 +863,13 @@ def cmd_add(args: list[str]):
863
863
  # parse options
864
864
  clean_args = []
865
865
  skip_setup = False
866
+ select = False
866
867
 
867
868
  for arg in args:
868
- if arg == "--skip-setup":
869
+ if arg in ["--skip-setup", "--no-setup"]:
869
870
  skip_setup = True
871
+ elif arg == "--select":
872
+ select = True
870
873
  else:
871
874
  clean_args.append(arg)
872
875
 
@@ -877,7 +880,28 @@ def cmd_add(args: list[str]):
877
880
  work_name = clean_args[0]
878
881
  branch_to_use = clean_args[1] if len(clean_args) >= 2 else None
879
882
 
880
- add_worktree(work_name, branch_to_use=branch_to_use, skip_setup=skip_setup)
883
+ base_dir = find_base_dir()
884
+ wt_path = add_worktree(work_name, branch_to_use=branch_to_use, skip_setup=skip_setup, base_dir=base_dir)
885
+
886
+ if select and wt_path:
887
+ wt_dir = base_dir / ".wt"
888
+ # Ensure .wt directory and its management files exists
889
+ create_hook_template(base_dir)
890
+ last_sel_file = wt_dir / "last_selection"
891
+
892
+ # Get current selection name
893
+ current_sel = os.environ.get("WT_SESSION_NAME")
894
+ if not current_sel:
895
+ cwd = Path.cwd().resolve()
896
+ worktrees = get_worktree_info(base_dir)
897
+ resolved_base = base_dir.resolve()
898
+ for wt in worktrees:
899
+ p = Path(wt["path"]).resolve()
900
+ if cwd == p or cwd.is_relative_to(p):
901
+ current_sel = "main" if p == resolved_base else p.name
902
+ break
903
+
904
+ switch_selection(work_name, base_dir, current_sel, last_sel_file)
881
905
 
882
906
 
883
907
  def cmd_stash(args: list[str]):
@@ -1415,7 +1439,8 @@ def cmd_select(args: list[str]):
1415
1439
  sys.exit(1)
1416
1440
 
1417
1441
  wt_dir = base_dir / ".wt"
1418
- wt_dir.mkdir(exist_ok=True)
1442
+ # Ensure .wt directory and its management files (.gitignore etc) exist
1443
+ create_hook_template(base_dir)
1419
1444
  last_sel_file = wt_dir / "last_selection"
1420
1445
 
1421
1446
  # Get current selection name based on CWD or environment
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "easy-worktree"
7
- version = "0.1.3"
7
+ version = "0.1.5"
8
8
  description = "Git worktree を簡単に管理するための CLI ツール"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -732,5 +732,89 @@ touch hook_ran.txt
732
732
  self.assertFalse((wt_dir / "base.txt").exists(), "Should NOT have copied base.txt (overridden)")
733
733
 
734
734
 
735
+ def test_19_wt_gitignore_last_selection(self):
736
+ """Test if .wt/.gitignore contains last_selection after wt select"""
737
+ project_dir = self.test_dir / "wt-gitignore-test"
738
+ if project_dir.exists():
739
+ shutil.rmtree(project_dir)
740
+ project_dir.mkdir()
741
+ subprocess.run(["git", "init"], cwd=project_dir)
742
+ (project_dir / "README.md").write_text("Hello")
743
+ subprocess.run(["git", "add", "."], cwd=project_dir)
744
+ subprocess.run(["git", "commit", "-m", "Initial commit"], cwd=project_dir)
745
+
746
+ # wt init
747
+ self.run_wt(["init"], cwd=project_dir)
748
+
749
+ # Verify .wt/.gitignore exists and contains last_selection
750
+ wt_gitignore = project_dir / ".wt" / ".gitignore"
751
+ self.assertTrue(wt_gitignore.exists())
752
+ self.assertIn("last_selection", wt_gitignore.read_text())
753
+
754
+ # Test wt select also triggers it (though init already does)
755
+ # Remove .wt to test re-creation/initialization by select
756
+ shutil.rmtree(project_dir / ".wt")
757
+ self.assertFalse((project_dir / ".wt").exists())
758
+
759
+ # Run wt select main
760
+ self.run_wt(["select", "main"], cwd=project_dir)
761
+
762
+ self.assertTrue(wt_gitignore.exists())
763
+ self.assertIn("last_selection", wt_gitignore.read_text())
764
+
765
+ def test_20_add_no_setup(self):
766
+ """Test 'wt add --no-setup' (alias for --skip-setup)"""
767
+ project_dir = self.test_dir / "no-setup-test"
768
+ if project_dir.exists():
769
+ shutil.rmtree(project_dir)
770
+ project_dir.mkdir()
771
+ subprocess.run(["git", "init"], cwd=project_dir)
772
+ (project_dir / "README.md").write_text("Hello")
773
+ subprocess.run(["git", "add", "."], cwd=project_dir)
774
+ subprocess.run(["git", "commit", "-m", "Initial commit"], cwd=project_dir)
775
+ self.run_wt(["init"], cwd=project_dir)
776
+
777
+ # Config setup files
778
+ config_file = project_dir / ".wt" / "config.toml"
779
+ with open(config_file, "r") as f:
780
+ config = toml.load(f)
781
+ config["setup_files"] = ["setup_me.txt"]
782
+ with open(config_file, "w") as f:
783
+ toml.dump(config, f)
784
+
785
+ # Create the setup file
786
+ (project_dir / "setup_me.txt").write_text("setup content")
787
+
788
+ print("\nTesting wt add --no-setup...")
789
+ self.run_wt(["add", "wt-no-setup", "--no-setup"], cwd=project_dir)
790
+
791
+ wt_dir = project_dir / ".worktrees" / "wt-no-setup"
792
+
793
+ # Verify setup file NOT copied
794
+ self.assertFalse((wt_dir / "setup_me.txt").exists(), "Setup file should NOT be copied with --no-setup")
795
+
796
+ def test_21_add_select(self):
797
+ """Test 'wt add --select' (auto switch)"""
798
+ # Note: In non-TTY environment, switch_selection prints the absolute path.
799
+ project_dir = self.test_dir / "add-select-test"
800
+ if project_dir.exists():
801
+ shutil.rmtree(project_dir)
802
+ project_dir.mkdir()
803
+ subprocess.run(["git", "init"], cwd=project_dir)
804
+ (project_dir / "README.md").write_text("Hello")
805
+ subprocess.run(["git", "add", "."], cwd=project_dir)
806
+ subprocess.run(["git", "commit", "-m", "Initial commit"], cwd=project_dir)
807
+ self.run_wt(["init"], cwd=project_dir)
808
+
809
+ print("\nTesting wt add --select...")
810
+ # Since this is non-TTY, it should output the path
811
+ result = self.run_wt(["add", "wt-select", "--select"], cwd=project_dir)
812
+
813
+ self.assertEqual(result.returncode, 0)
814
+
815
+ # Check if output contains the path to the new worktree
816
+ expected_path = str((project_dir / ".worktrees" / "wt-select").absolute())
817
+ self.assertIn(expected_path, result.stdout.strip())
818
+
735
819
  if __name__ == "__main__":
736
820
  unittest.main()
@@ -4,7 +4,7 @@ requires-python = ">=3.10"
4
4
 
5
5
  [[package]]
6
6
  name = "easy-worktree"
7
- version = "0.1.3"
7
+ version = "0.1.4"
8
8
  source = { editable = "." }
9
9
  dependencies = [
10
10
  { name = "toml" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes