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

devonfw / IDEasy / 11061200804

26 Sep 2024 10:27PM UTC coverage: 66.053% (-0.05%) from 66.107%
11061200804

push

github

web-flow
#593: #651: #564: #439: fixed bugs, refactored tool dependencies (#652)

2312 of 3848 branches covered (60.08%)

Branch coverage included in aggregate %.

6078 of 8854 relevant lines covered (68.65%)

3.03 hits per line

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

81.94
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.Collection;
9
import java.util.HashMap;
10
import java.util.HashSet;
11
import java.util.List;
12
import java.util.Map;
13
import java.util.Set;
14

15
import com.devonfw.tools.ide.common.Tag;
16
import com.devonfw.tools.ide.context.IdeContext;
17
import com.devonfw.tools.ide.process.ProcessContext;
18
import com.devonfw.tools.ide.process.ProcessErrorHandling;
19
import com.devonfw.tools.ide.process.ProcessMode;
20
import com.devonfw.tools.ide.step.Step;
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.ToolPluginDescriptor;
24
import com.fasterxml.jackson.databind.ObjectMapper;
25

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

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

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

41
  @Override
42
  protected String getBinaryName() {
43

44
    return "code";
2✔
45
  }
46

47
  @Override
48
  public void installPlugin(ToolPluginDescriptor plugin, Step step) {
49

50
    doInstallPlugins(List.of(plugin));
×
51
    step.success();
×
52
  }
×
53

54
  @Override
55
  protected void installPlugins(Collection<ToolPluginDescriptor> plugins) {
56

57
    List<ToolPluginDescriptor> pluginsToInstall = new ArrayList<>();
4✔
58
    List<ToolPluginDescriptor> pluginsToRecommend = new ArrayList<>();
4✔
59

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

70
  }
1✔
71

72
  private void doInstallPlugins(List<ToolPluginDescriptor> pluginsToInstall) {
73

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

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

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

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

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

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

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

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

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

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

126
  @Override
127
  protected void configureToolArgs(ProcessContext pc, ProcessMode processMode, ProcessErrorHandling errorHandling, String... args) {
128

129
    Path vsCodeConf = this.context.getWorkspacePath().resolve(".vscode/.userdata");
6✔
130
    pc.addArg("--new-window");
4✔
131
    pc.addArg("--user-data-dir=" + vsCodeConf);
5✔
132
    Path vsCodeExtensionFolder = this.context.getIdeHome().resolve("plugins/vscode");
6✔
133
    pc.addArg("--extensions-dir=" + vsCodeExtensionFolder);
5✔
134
    super.configureToolArgs(pc, processMode, errorHandling, args);
6✔
135
  }
1✔
136

137
}
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

© 2026 Coveralls, Inc