• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

devonfw / IDEasy / 11019972842

24 Sep 2024 06:42PM UTC coverage: 66.107% (+0.2%) from 65.911%
11019972842

Pull #538

github

web-flow
Merge 83a22b241 into 3ddcdd758
Pull Request #538: #37: Tool commandlet for visual studio code

2317 of 3850 branches covered (60.18%)

Branch coverage included in aggregate %.

6105 of 8890 relevant lines covered (68.67%)

3.03 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

85.33
cli/src/main/java/com/devonfw/tools/ide/tool/vscode/Vscode.java
1
package com.devonfw.tools.ide.tool.vscode;
2

3
import java.io.BufferedReader;
4
import java.io.IOException;
5
import java.nio.file.Files;
6
import java.nio.file.Path;
7
import java.util.ArrayList;
8
import java.util.Arrays;
9
import java.util.Collection;
10
import java.util.HashMap;
11
import java.util.HashSet;
12
import java.util.List;
13
import java.util.Map;
14
import java.util.Set;
15

16
import com.devonfw.tools.ide.common.Tag;
17
import com.devonfw.tools.ide.context.IdeContext;
18
import com.devonfw.tools.ide.process.ProcessContext;
19
import com.devonfw.tools.ide.process.ProcessErrorHandling;
20
import com.devonfw.tools.ide.process.ProcessMode;
21
import com.devonfw.tools.ide.tool.ToolCommandlet;
22
import com.devonfw.tools.ide.tool.ide.IdeToolCommandlet;
23
import com.devonfw.tools.ide.tool.plugin.PluginDescriptor;
24
import com.devonfw.tools.ide.version.VersionIdentifier;
25
import com.fasterxml.jackson.databind.ObjectMapper;
26

27
/**
28
 * {@link ToolCommandlet} for <a href="https://code.visualstudio.com/">vscode</a>.
29
 */
30
public class Vscode extends IdeToolCommandlet {
31

32
  /**
33
   * The constructor.
34
   *
35
   * @param context the {@link IdeContext}.
36
   */
37
  public Vscode(IdeContext context) {
38

39
    super(context, "vscode", Set.of(Tag.VS_CODE));
6✔
40
  }
1✔
41

42
  @Override
43
  protected String getBinaryName() {
44

45
    return "code";
2✔
46
  }
47

48
  @Override
49
  public void installPlugin(PluginDescriptor plugin) {
50

51
  }
×
52

53
  @Override
54
  protected void installPlugins(Collection<PluginDescriptor> plugins) {
55

56
    List<PluginDescriptor> pluginsToInstall = new ArrayList<>();
4✔
57
    List<PluginDescriptor> pluginsToRecommend = new ArrayList<>();
4✔
58

59
    for (PluginDescriptor plugin : plugins) {
10✔
60
      if (plugin.isActive()) {
3✔
61
        pluginsToInstall.add(plugin);
5✔
62
      } else {
63
        pluginsToRecommend.add(plugin);
4✔
64
      }
65
    }
1✔
66
    doAddRecommendations(pluginsToRecommend);
3✔
67
    doInstallPlugins(pluginsToInstall);
3✔
68

69
  }
1✔
70

71
  private void doInstallPlugins(List<PluginDescriptor> pluginsToInstall) {
72

73
    List<String> extensionsCommands = new ArrayList<>();
4✔
74

75
    if (pluginsToInstall.isEmpty()) {
3!
76
      this.context.info("No plugins to be installed");
×
77
    } else {
78

79
      for (PluginDescriptor plugin : pluginsToInstall) {
10✔
80
        extensionsCommands.add("--install-extension");
4✔
81
        extensionsCommands.add(plugin.getId());
5✔
82
      }
1✔
83
    }
84
    runTool(ProcessMode.DEFAULT, null, extensionsCommands.toArray(new String[0]));
9✔
85
  }
1✔
86

87
  private void doAddRecommendations(List<PluginDescriptor> recommendations) {
88
    Path extensionsJsonPath = this.context.getWorkspacePath().resolve(".vscode/extensions.json");
6✔
89

90
    ObjectMapper objectMapper = new ObjectMapper();
4✔
91
    Map<String, Object> recommendationsMap;
92

93
    if (Files.exists(extensionsJsonPath)) {
5!
94
      try (BufferedReader reader = Files.newBufferedReader(extensionsJsonPath)) {
3✔
95
        recommendationsMap = objectMapper.readValue(reader, Map.class);
6✔
96
      } catch (IOException e) {
×
97
        throw new RuntimeException(e);
×
98
      }
1✔
99
    } else {
100
      recommendationsMap = new HashMap<>();
×
101
    }
102

103
    List<String> existingRecommendations = (List<String>) recommendationsMap.getOrDefault("recommendations", new ArrayList<>());
8✔
104

105
    try {
106
      int addedRecommendations = 0;
2✔
107
      Set<String> existingRecommendationsSet = new HashSet<>(existingRecommendations);
5✔
108
      for (PluginDescriptor recommendation : recommendations) {
10✔
109
        String recommendationId = recommendation.getId();
3✔
110
        if (existingRecommendationsSet.add(recommendationId)) {
4!
111
          existingRecommendations.add(recommendationId);
4✔
112
          addedRecommendations++;
1✔
113
        }
114
      }
1✔
115

116
      if (addedRecommendations > 0) {
2!
117
        objectMapper.writeValue(extensionsJsonPath.toFile(), recommendationsMap);
5✔
118
      }
119

120
    } catch (IOException e) {
×
121
      this.context.error(e);
×
122
    }
1✔
123
  }
1✔
124

125
  @Override
126
  public void runTool(ProcessMode processMode, VersionIdentifier toolVersion, String... args) {
127

128
    install(true);
4✔
129

130
    Path vsCodeConf = this.context.getWorkspacePath().resolve(".vscode/.userdata");
6✔
131
    Path vsCodeExtensionFolder = this.context.getIdeHome().resolve("plugins/vscode");
6✔
132

133
    List<String> command = new ArrayList<>();
4✔
134
    command.add("--new-window");
4✔
135
    command.add("--user-data-dir=" + vsCodeConf);
5✔
136
    command.add("--extensions-dir=" + vsCodeExtensionFolder);
5✔
137

138
    command.addAll(Arrays.asList(args));
5✔
139

140
    Path binaryPath;
141
    binaryPath = Path.of(getBinaryName());
6✔
142
    ProcessContext pc = this.context.newProcess().errorHandling(ProcessErrorHandling.THROW).executable(binaryPath).addArgs(command.toArray());
11✔
143
    pc.run(processMode);
4✔
144
  }
1✔
145

146
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc