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

devonfw / IDEasy / 13440922988

20 Feb 2025 05:16PM UTC coverage: 67.945% (-0.01%) from 67.959%
13440922988

push

github

web-flow
#1053: fix setup #1044: setup rewritten in Java (#1055)

Co-authored-by: jan-vcapgemini <59438728+jan-vcapgemini@users.noreply.github.com>

2992 of 4849 branches covered (61.7%)

Branch coverage included in aggregate %.

7765 of 10983 relevant lines covered (70.7%)

3.08 hits per line

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

67.31
cli/src/main/java/com/devonfw/tools/ide/context/IdeContext.java
1
package com.devonfw.tools.ide.context;
2

3
import java.nio.file.Files;
4
import java.nio.file.Path;
5

6
import com.devonfw.tools.ide.cli.CliAbortException;
7
import com.devonfw.tools.ide.cli.CliException;
8
import com.devonfw.tools.ide.cli.CliOfflineException;
9
import com.devonfw.tools.ide.commandlet.CommandletManager;
10
import com.devonfw.tools.ide.common.SystemPath;
11
import com.devonfw.tools.ide.environment.EnvironmentVariables;
12
import com.devonfw.tools.ide.environment.EnvironmentVariablesType;
13
import com.devonfw.tools.ide.environment.IdeSystem;
14
import com.devonfw.tools.ide.git.GitContext;
15
import com.devonfw.tools.ide.io.FileAccess;
16
import com.devonfw.tools.ide.io.IdeProgressBar;
17
import com.devonfw.tools.ide.io.IdeProgressBarNone;
18
import com.devonfw.tools.ide.merge.DirectoryMerger;
19
import com.devonfw.tools.ide.os.SystemInfo;
20
import com.devonfw.tools.ide.os.WindowsPathSyntax;
21
import com.devonfw.tools.ide.process.ProcessContext;
22
import com.devonfw.tools.ide.step.Step;
23
import com.devonfw.tools.ide.tool.mvn.Mvn;
24
import com.devonfw.tools.ide.tool.repository.CustomToolRepository;
25
import com.devonfw.tools.ide.tool.repository.MavenRepository;
26
import com.devonfw.tools.ide.tool.repository.ToolRepository;
27
import com.devonfw.tools.ide.url.model.UrlMetadata;
28
import com.devonfw.tools.ide.variable.IdeVariables;
29
import com.devonfw.tools.ide.version.VersionIdentifier;
30

31
/**
32
 * Interface for interaction with the user allowing to input and output information.
33
 */
34
public interface IdeContext extends IdeStartContext {
35

36
  /**
37
   * The default settings URL.
38
   *
39
   * @see com.devonfw.tools.ide.commandlet.AbstractUpdateCommandlet
40
   */
41
  String DEFAULT_SETTINGS_REPO_URL = "https://github.com/devonfw/ide-settings.git";
42

43
  /** The name of the workspaces folder. */
44
  String FOLDER_WORKSPACES = "workspaces";
45

46
  /** The name of the {@link #getSettingsPath() settings} folder. */
47
  String FOLDER_SETTINGS = "settings";
48

49
  /** The name of the {@link #getSoftwarePath() software} folder. */
50
  String FOLDER_SOFTWARE = "software";
51

52
  /** The name of the {@link #getUrlsPath() urls} folder. */
53
  String FOLDER_URLS = "urls";
54

55
  /** The name of the conf folder for project specific user configurations. */
56
  String FOLDER_CONF = "conf";
57

58
  /**
59
   * The name of the folder inside IDE_ROOT reserved for IDEasy. Intentionally starting with an underscore and not a dot to prevent effects like OS hiding,
60
   * maven filtering, .gitignore and to distinguish from {@link #FOLDER_DOT_IDE}.
61
   *
62
   * @see #getIdePath()
63
   */
64
  String FOLDER_UNDERSCORE_IDE = "_ide";
65

66
  /**
67
   * The name of the folder inside {@link #FOLDER_UNDERSCORE_IDE} with the current IDEasy installation.
68
   *
69
   * @see #getIdeInstallationPath()
70
   */
71
  String FOLDER_INSTALLATION = "installation";
72

73
  /**
74
   * The name of the hidden folder for IDE configuration in the users home directory or status information in the IDE_HOME directory.
75
   *
76
   * @see #getUserHomeIde()
77
   */
78
  String FOLDER_DOT_IDE = ".ide";
79

80
  /** The name of the updates folder for temporary data and backup. */
81
  String FOLDER_UPDATES = "updates";
82

83
  /** The name of the volume folder for mounting archives like *.dmg. */
84
  String FOLDER_VOLUME = "volume";
85

86
  /** The name of the backups folder for backup. */
87
  String FOLDER_BACKUPS = "backups";
88

89
  /** The name of the downloads folder. */
90
  String FOLDER_DOWNLOADS = "Downloads";
91

92
  /** The name of the bin folder where executable files are found by default. */
93
  String FOLDER_BIN = "bin";
94

95
  /** The name of the repositories folder where properties files are stores for each repository */
96
  String FOLDER_REPOSITORIES = "repositories";
97

98
  /** The name of the repositories folder where properties files are stores for each repository */
99
  String FOLDER_LEGACY_REPOSITORIES = "projects";
100

101
  /** The name of the Contents folder inside a MacOS app. */
102
  String FOLDER_CONTENTS = "Contents";
103

104
  /** The name of the Resources folder inside a MacOS app. */
105
  String FOLDER_RESOURCES = "Resources";
106

107
  /** The name of the app folder inside a MacOS app. */
108
  String FOLDER_APP = "app";
109

110
  /** The name of the extra folder inside the software folder */
111
  String FOLDER_EXTRA = "extra";
112

113
  /**
114
   * The name of the {@link #getPluginsPath() plugins folder} and also the plugins folder inside the IDE folders of {@link #getSettingsPath() settings} (e.g.
115
   * settings/eclipse/plugins).
116
   */
117
  String FOLDER_PLUGINS = "plugins";
118

119
  /**
120
   * The name of the workspace folder inside the IDE specific {@link #FOLDER_SETTINGS settings} containing the configuration templates in #FOLDER_SETUP
121
   * #FOLDER_UPDATE.
122
   */
123
  String FOLDER_WORKSPACE = "workspace";
124

125
  /**
126
   * The name of the setup folder inside the {@link #FOLDER_WORKSPACE workspace} folder containing the templates for the configuration templates for the initial
127
   * setup of a workspace. This is closely related with the {@link #FOLDER_UPDATE update} folder.
128
   */
129
  String FOLDER_SETUP = "setup";
130

131
  /**
132
   * The name of the update folder inside the {@link #FOLDER_WORKSPACE workspace} folder containing the templates for the configuration templates for the update
133
   * of a workspace. Configurations in this folder will be applied every time the IDE is started. They will override the settings the user may have manually
134
   * configured every time. This is only for settings that have to be the same for every developer in the project. An example would be the number of spaces used
135
   * for indentation and other code-formatting settings. If all developers in a project team use the same formatter settings, this will actively prevent
136
   * diff-wars. However, the entire team needs to agree on these settings.<br> Never configure aspects inside this update folder that may be of personal flavor
137
   * such as the color theme. Otherwise developers will hate you as you actively take away their freedom to customize the IDE to their personal needs and
138
   * wishes. Therefore do all "biased" or "flavored" configurations in {@link #FOLDER_SETUP setup} so these are only pre-configured but can be changed by the
139
   * user as needed.
140
   */
141
  String FOLDER_UPDATE = "update";
142

143
  /**
144
   * The name of the folder inside {@link #FOLDER_UNDERSCORE_IDE _ide} folder containing internal resources and scripts of IDEasy.
145
   */
146
  String FOLDER_INTERNAL = "internal";
147

148
  /** The file where the installed software version is written to as plain text. */
149
  String FILE_SOFTWARE_VERSION = ".ide.software.version";
150

151
  /** The file where the installed software version is written to as plain text. */
152
  String FILE_LEGACY_SOFTWARE_VERSION = ".devon.software.version";
153

154
  /** The file for the license agreement. */
155
  String FILE_LICENSE_AGREEMENT = ".license.agreement";
156

157
  /** The file extension for a {@link java.util.Properties} file. */
158
  String EXT_PROPERTIES = ".properties";
159

160
  /** The default for {@link #getWorkspaceName()}. */
161
  String WORKSPACE_MAIN = "main";
162

163
  /** The folder with the configuration template files from the settings. */
164
  String FOLDER_TEMPLATES = "templates";
165

166
  /** Legacy folder name used as compatibility fallback if {@link #FOLDER_TEMPLATES} does not exist. */
167
  String FOLDER_LEGACY_TEMPLATES = "devon";
168

169
  /** The default folder name for {@link #getIdeRoot() IDE_ROOT}. */
170
  String FOLDER_PROJECTS = "projects";
171

172
  /** The filename of the configuration file in the settings for this {@link CustomToolRepository}. */
173
  String FILE_CUSTOM_TOOLS = "ide-custom-tools.json";
174

175
  /**
176
   * file containing the current local commit hash of the settings repository.
177
   */
178
  String SETTINGS_COMMIT_ID = ".commit.id";
179

180
  /** The IDEasy ASCII logo. */
181
  String LOGO = """
4✔
182
      __       ___ ___  ___
183
      ╲ ╲     |_ _|   ╲| __|__ _ ____ _
184
       > >     | || |) | _|/ _` (_-< || |
185
      /_/ ___ |___|___/|___╲__,_/__/╲_, |
186
         |___|                       |__/
187
      """.replace('╲', '\\');
2✔
188

189
  /**
190
   * @return {@code true} if {@link #isOfflineMode() offline mode} is active or we are NOT {@link #isOnline() online}, {@code false} otherwise.
191
   */
192
  default boolean isOffline() {
193

194
    return isOfflineMode() || !isOnline();
10!
195
  }
196

197
  /**
198
   * @return {@code true} if we are currently online (Internet access is available), {@code false} otherwise.
199
   */
200
  boolean isOnline();
201

202
  /**
203
   * Print the IDEasy {@link #LOGO logo}.
204
   */
205
  default void printLogo() {
206

207
    info(LOGO);
3✔
208
  }
1✔
209

210
  /**
211
   * Asks the user for a single string input.
212
   *
213
   * @param message The information message to display.
214
   * @param defaultValue The default value to return when no input is provided.
215
   * @return The string input from the user, or the default value if no input is provided.
216
   */
217
  String askForInput(String message, String defaultValue);
218

219
  /**
220
   * Asks the user for a single string input.
221
   *
222
   * @param message The information message to display.
223
   * @return The string input from the user, or the default value if no input is provided.
224
   */
225
  String askForInput(String message);
226

227
  /**
228
   * @param question the question to ask.
229
   * @return {@code true} if the user answered with "yes", {@code false} otherwise ("no").
230
   */
231
  default boolean question(String question) {
232

233
    String yes = "yes";
×
234
    String option = question(question, yes, "no");
×
235
    if (yes.equals(option)) {
×
236
      return true;
×
237
    }
238
    return false;
×
239
  }
240

241
  /**
242
   * @param <O> type of the option. E.g. {@link String}.
243
   * @param question the question to ask.
244
   * @param options the available options for the user to answer. There should be at least two options given as otherwise the question cannot make sense.
245
   * @return the option selected by the user as answer.
246
   */
247
  @SuppressWarnings("unchecked")
248
  <O> O question(String question, O... options);
249

250
  /**
251
   * Will ask the given question. If the user answers with "yes" the method will return and the process can continue. Otherwise if the user answers with "no" an
252
   * exception is thrown to abort further processing.
253
   *
254
   * @param question the yes/no question to {@link #question(String) ask}.
255
   * @throws CliAbortException if the user answered with "no" and further processing shall be aborted.
256
   */
257
  default void askToContinue(String question) {
258

259
    boolean yesContinue = question(question);
×
260
    if (!yesContinue) {
×
261
      throw new CliAbortException();
×
262
    }
263
  }
×
264

265
  /**
266
   * @param purpose the purpose why Internet connection is required.
267
   * @throws CliException if you are {@link #isOffline() offline}.
268
   */
269
  default void requireOnline(String purpose) {
270

271
    if (isOfflineMode()) {
3!
272
      throw CliOfflineException.ofPurpose(purpose);
3✔
273
    }
274
  }
×
275

276
  /**
277
   * @return the {@link SystemInfo}.
278
   */
279
  SystemInfo getSystemInfo();
280

281
  /**
282
   * @return the {@link EnvironmentVariables} with full inheritance.
283
   */
284
  EnvironmentVariables getVariables();
285

286
  /**
287
   * @return the {@link FileAccess}.
288
   */
289
  FileAccess getFileAccess();
290

291
  /**
292
   * @return the {@link CommandletManager}.
293
   */
294
  CommandletManager getCommandletManager();
295

296
  /**
297
   * @return the default {@link ToolRepository}.
298
   */
299
  ToolRepository getDefaultToolRepository();
300

301
  /**
302
   * @return the {@link CustomToolRepository}.
303
   */
304
  CustomToolRepository getCustomToolRepository();
305

306
  /**
307
   * @return the {@link MavenRepository}.
308
   */
309
  MavenRepository getMavenToolRepository();
310

311
  /**
312
   * @return the {@link Path} to the IDE instance directory. You can have as many IDE instances on the same computer as independent tenants for different
313
   *     isolated projects.
314
   * @see com.devonfw.tools.ide.variable.IdeVariables#IDE_HOME
315
   */
316
  Path getIdeHome();
317

318
  /**
319
   * @return the name of the current project.
320
   * @see com.devonfw.tools.ide.variable.IdeVariables#PROJECT_NAME
321
   */
322
  String getProjectName();
323

324
  /**
325
   * @return the IDEasy version the {@link #getIdeHome() current project} was created with or migrated to.
326
   */
327
  VersionIdentifier getProjectVersion();
328

329
  /**
330
   * @param version the new value of {@link #getProjectVersion()}.
331
   */
332
  void setProjectVersion(VersionIdentifier version);
333

334
  /**
335
   * @return the {@link Path} to the IDE installation root directory. This is the top-level folder where the {@link #getIdeHome() IDE instances} are located as
336
   *     sub-folder. There is a reserved ".ide" folder where central IDE data is stored such as the {@link #getUrlsPath() download metadata} and the central
337
   *     software repository.
338
   * @see com.devonfw.tools.ide.variable.IdeVariables#IDE_ROOT
339
   */
340
  Path getIdeRoot();
341

342
  /**
343
   * @return the {@link Path} to the {@link #FOLDER_UNDERSCORE_IDE}.
344
   * @see #getIdeRoot()
345
   * @see #FOLDER_UNDERSCORE_IDE
346
   */
347
  Path getIdePath();
348

349
  /**
350
   * @return the {@link Path} to the {@link #FOLDER_INSTALLATION installation} folder of IDEasy. This is a link to the (latest) installed release of IDEasy. On
351
   *     upgrade a new release is installed and the link is switched to the new release.
352
   */
353
  default Path getIdeInstallationPath() {
354

355
    return getIdePath().resolve(FOLDER_INSTALLATION);
×
356
  }
357

358
  /**
359
   * @return the current working directory ("user.dir"). This is the directory where the user's shell was located when the IDE CLI was invoked.
360
   */
361
  Path getCwd();
362

363
  /**
364
   * @return the {@link Path} for the temporary directory to use. Will be different from the OS specific temporary directory (java.io.tmpDir).
365
   */
366
  Path getTempPath();
367

368
  /**
369
   * @return the {@link Path} for the temporary download directory to use.
370
   */
371
  Path getTempDownloadPath();
372

373
  /**
374
   * @return the {@link Path} to the download metadata (ide-urls). Here a git repository is cloned and updated (pulled) to always have the latest metadata to
375
   *     download tools.
376
   * @see com.devonfw.tools.ide.url.model.folder.UrlRepository
377
   */
378
  Path getUrlsPath();
379

380
  /**
381
   * @return the {@link UrlMetadata}. Will be lazily instantiated and thereby automatically be cloned or pulled (by default).
382
   */
383
  UrlMetadata getUrls();
384

385
  /**
386
   * @return the {@link Path} to the download cache. All downloads will be placed here using a unique naming pattern that allows to reuse these artifacts. So if
387
   *     the same artifact is requested again it will be taken from the cache to avoid downloading it again.
388
   */
389
  Path getDownloadPath();
390

391
  /**
392
   * @return the {@link Path} to the software folder inside {@link #getIdeHome() IDE_HOME}. All tools for that IDE instance will be linked here from the
393
   *     {@link #getSoftwareRepositoryPath() software repository} as sub-folder named after the according tool.
394
   */
395
  Path getSoftwarePath();
396

397
  /**
398
   * @return the {@link Path} to the extra folder inside software folder inside {@link #getIdeHome() IDE_HOME}. All tools for that IDE instance will be linked
399
   *     here from the {@link #getSoftwareRepositoryPath() software repository} as sub-folder named after the according tool.
400
   */
401
  Path getSoftwareExtraPath();
402

403
  /**
404
   * @return the {@link Path} to the global software repository. This is the central directory where the tools are extracted physically on the local disc. Those
405
   *     are shared among all IDE instances (see {@link #getIdeHome() IDE_HOME}) via symbolic links (see {@link #getSoftwarePath()}). Therefore this repository
406
   *     follows the sub-folder structure {@code «repository»/«tool»/«edition»/«version»/}. So multiple versions of the same tool exist here as different
407
   *     folders. Further, such software may not be modified so e.g. installation of plugins and other kind of changes to such tool need to happen strictly out
408
   *     of the scope of this folders.
409
   */
410
  Path getSoftwareRepositoryPath();
411

412
  /**
413
   * @return the {@link Path} to the {@link #FOLDER_PLUGINS plugins folder} inside {@link #getIdeHome() IDE_HOME}. All plugins of the IDE instance will be
414
   *     stored here. For each tool that supports plugins a sub-folder with the tool name will be created where the plugins for that tool get installed.
415
   */
416
  Path getPluginsPath();
417

418
  /**
419
   * @return the {@link Path} to the central tool repository. All tools will be installed in this location using the directory naming schema of
420
   *     {@code «repository»/«tool»/«edition»/«version»/}. Actual {@link #getIdeHome() IDE instances} will only contain symbolic links to the physical tool
421
   *     installations in this repository. This allows to share and reuse tool installations across multiple {@link #getIdeHome() IDE instances}. The variable
422
   *     {@code «repository»} is typically {@code default} for the tools from our standard {@link #getUrlsPath() ide-urls download metadata} but this will
423
   *     differ for custom tools from a private repository.
424
   */
425
  Path getToolRepositoryPath();
426

427
  /**
428
   * @return the {@link Path} to the users home directory. Typically initialized via the {@link System#getProperty(String) system property} "user.home".
429
   * @see com.devonfw.tools.ide.variable.IdeVariables#HOME
430
   */
431
  Path getUserHome();
432

433
  /**
434
   * @return the {@link Path} to the ".ide" subfolder in the {@link #getUserHome() users home directory}.
435
   */
436
  Path getUserHomeIde();
437

438
  /**
439
   * @return the {@link Path} to the {@link #FOLDER_SETTINGS settings} folder with the cloned git repository containing the project configuration.
440
   */
441
  Path getSettingsPath();
442

443
  /**
444
   * @return the {@link Path} to the {@link #FOLDER_REPOSITORIES repositories} folder with legacy fallback if not present or {@code null} if not found.
445
   */
446
  default Path getRepositoriesPath() {
447

448
    Path settingsPath = getSettingsPath();
3✔
449
    if (settingsPath == null) {
2!
450
      return null;
×
451
    }
452
    Path repositoriesPath = settingsPath.resolve(IdeContext.FOLDER_REPOSITORIES);
4✔
453
    if (Files.isDirectory(repositoriesPath)) {
5✔
454
      return repositoriesPath;
2✔
455
    }
456
    Path legacyRepositoriesPath = settingsPath.resolve(IdeContext.FOLDER_LEGACY_REPOSITORIES);
4✔
457
    if (Files.isDirectory(legacyRepositoriesPath)) {
5!
458
      return legacyRepositoriesPath;
×
459
    }
460
    return null;
2✔
461
  }
462

463
  /**
464
   * @return the {@link Path} to the {@code settings} folder with the cloned git repository containing the project configuration only if the settings repository
465
   *     is in fact a git repository.
466
   */
467
  Path getSettingsGitRepository();
468

469
  /**
470
   * @return {@code true} if the settings repository is a symlink or a junction.
471
   */
472
  boolean isSettingsRepositorySymlinkOrJunction();
473

474
  /**
475
   * @return the {@link Path} to the file containing the last tracked commit Id of the settings repository.
476
   */
477
  Path getSettingsCommitIdPath();
478

479
  /**
480
   * @return the {@link Path} to the templates folder inside the {@link #getSettingsPath() settings}. The relative directory structure in this templates folder
481
   *     is to be applied to {@link #getIdeHome() IDE_HOME} when the project is set up.
482
   */
483
  default Path getSettingsTemplatePath() {
484
    Path settingsFolder = getSettingsPath();
3✔
485
    Path templatesFolder = settingsFolder.resolve(IdeContext.FOLDER_TEMPLATES);
4✔
486
    if (!Files.isDirectory(templatesFolder)) {
5✔
487
      Path templatesFolderLegacy = settingsFolder.resolve(IdeContext.FOLDER_LEGACY_TEMPLATES);
4✔
488
      if (Files.isDirectory(templatesFolderLegacy)) {
5!
489
        templatesFolder = templatesFolderLegacy;
×
490
      } else {
491
        warning("No templates found in settings git repo neither in {} nor in {} - configuration broken", templatesFolder, templatesFolderLegacy);
13✔
492
        return null;
2✔
493
      }
494
    }
495
    return templatesFolder;
2✔
496
  }
497

498
  /**
499
   * @return the {@link Path} to the {@code conf} folder with instance specific tool configurations and the
500
   *     {@link EnvironmentVariablesType#CONF user specific project configuration}.
501
   */
502
  Path getConfPath();
503

504
  /**
505
   * @return the {@link Path} to the workspace.
506
   * @see #getWorkspaceName()
507
   */
508
  Path getWorkspacePath();
509

510
  /**
511
   * @return the name of the workspace. Defaults to {@link #WORKSPACE_MAIN}.
512
   */
513
  String getWorkspaceName();
514

515
  /**
516
   * @return the value of the system {@link IdeVariables#PATH PATH} variable. It is automatically extended according to the tools available in
517
   *     {@link #getSoftwarePath() software path} unless {@link #getIdeHome() IDE_HOME} was not found.
518
   */
519
  SystemPath getPath();
520

521
  /**
522
   * @return a new {@link ProcessContext} to {@link ProcessContext#run() run} external commands.
523
   */
524
  ProcessContext newProcess();
525

526
  /**
527
   * @param title the {@link IdeProgressBar#getTitle() title}.
528
   * @param size the {@link IdeProgressBar#getMaxSize() expected maximum size}.
529
   * @param unitName the {@link IdeProgressBar#getUnitName() unit name}.
530
   * @param unitSize the {@link IdeProgressBar#getUnitSize() unit size}.
531
   * @return the new {@link IdeProgressBar} to use.
532
   */
533
  IdeProgressBar newProgressBar(String title, long size, String unitName, long unitSize);
534

535
  /**
536
   * @param title the {@link IdeProgressBar#getTitle() title}.
537
   * @param size the {@link IdeProgressBar#getMaxSize() expected maximum size} in bytes.
538
   * @return the new {@link IdeProgressBar} to use.
539
   */
540
  default IdeProgressBar newProgressBarInMib(String title, long size) {
541

542
    if ((size > 0) && (size < 1024)) {
8✔
543
      return new IdeProgressBarNone(title, size, IdeProgressBar.UNIT_NAME_MB, IdeProgressBar.UNIT_SIZE_MB);
8✔
544
    }
545
    return newProgressBar(title, size, IdeProgressBar.UNIT_NAME_MB, IdeProgressBar.UNIT_SIZE_MB);
7✔
546
  }
547

548
  /**
549
   * @param size the {@link IdeProgressBar#getMaxSize() expected maximum size} in bytes.
550
   * @return the new {@link IdeProgressBar} for copy.
551
   */
552
  default IdeProgressBar newProgressBarForDownload(long size) {
553

554
    return newProgressBarInMib(IdeProgressBar.TITLE_DOWNLOADING, size);
5✔
555
  }
556

557
  /**
558
   * @param size the {@link IdeProgressBar#getMaxSize() expected maximum size} in bytes.
559
   * @return the new {@link IdeProgressBar} for extracting.
560
   */
561
  default IdeProgressBar newProgressbarForExtracting(long size) {
562

563
    return newProgressBarInMib(IdeProgressBar.TITLE_EXTRACTING, size);
5✔
564
  }
565

566
  /**
567
   * @param size the {@link IdeProgressBar#getMaxSize() expected maximum size} in bytes.
568
   * @return the new {@link IdeProgressBar} for copy.
569
   */
570
  default IdeProgressBar newProgressbarForCopying(long size) {
571

572
    return newProgressBarInMib(IdeProgressBar.TITLE_COPYING, size);
5✔
573
  }
574

575
  /**
576
   * @return the {@link DirectoryMerger} used to configure and merge the workspace for an {@link com.devonfw.tools.ide.tool.ide.IdeToolCommandlet IDE}.
577
   */
578
  DirectoryMerger getWorkspaceMerger();
579

580
  /**
581
   * @return the {@link Path} to the working directory from where the command is executed.
582
   */
583
  Path getDefaultExecutionDirectory();
584

585
  /**
586
   * @return the {@link IdeSystem} instance wrapping {@link System}.
587
   */
588
  IdeSystem getSystem();
589

590
  /**
591
   * @return the {@link GitContext} used to run several git commands.
592
   */
593
  GitContext getGitContext();
594

595
  /**
596
   * @return the String value for the variable MAVEN_ARGS, or null if called outside an IDEasy installation.
597
   */
598
  default String getMavenArgs() {
599

600
    if (getIdeHome() == null) {
3!
601
      return null;
×
602
    }
603
    Mvn mvn = getCommandletManager().getCommandlet(Mvn.class);
6✔
604
    return mvn.getMavenArgs();
3✔
605
  }
606

607
  /**
608
   * @return the {@link Path} pointing to the maven configuration directory (where "settings.xml" or "settings-security.xml" are located).
609
   */
610
  default Path getMavenConfigurationFolder() {
611

612
    if (getIdeHome() != null) {
3✔
613
      Path confPath = getConfPath();
3✔
614
      Path m2Folder = confPath.resolve(Mvn.MVN_CONFIG_FOLDER);
4✔
615
      if (!Files.isDirectory(m2Folder)) {
5✔
616
        Path m2LegacyFolder = confPath.resolve(Mvn.MVN_CONFIG_LEGACY_FOLDER);
4✔
617
        if (Files.isDirectory(m2LegacyFolder)) {
5!
618
          m2Folder = m2LegacyFolder;
×
619
        } else {
620
          // fallback to USER_HOME/.m2 folder
621
          m2Folder = getUserHome().resolve(Mvn.MVN_CONFIG_LEGACY_FOLDER);
5✔
622
        }
623
      }
624
      return m2Folder;
2✔
625
    }
626
    return null;
2✔
627
  }
628

629
  /**
630
   * Updates the current working directory (CWD) and configures the environment paths according to the specified parameters. This method is central to changing
631
   * the IDE's notion of where it operates, affecting where configurations, workspaces, settings, and other resources are located or loaded from.
632
   *
633
   * @return the current {@link Step} of processing.
634
   */
635
  Step getCurrentStep();
636

637
  /**
638
   * @param name the {@link Step#getName() name} of the new {@link Step}.
639
   * @return the new {@link Step} that has been created and started.
640
   */
641
  default Step newStep(String name) {
642

643
    return newStep(name, Step.NO_PARAMS);
5✔
644
  }
645

646
  /**
647
   * @param name the {@link Step#getName() name} of the new {@link Step}.
648
   * @param parameters the {@link Step#getParameter(int) parameters} of the {@link Step}.
649
   * @return the new {@link Step} that has been created and started.
650
   */
651
  default Step newStep(String name, Object... parameters) {
652

653
    return newStep(false, name, parameters);
6✔
654
  }
655

656
  /**
657
   * @param silent the {@link Step#isSilent() silent flag}.
658
   * @param name the {@link Step#getName() name} of the new {@link Step}.
659
   * @param parameters the {@link Step#getParameter(int) parameters} of the {@link Step}.
660
   * @return the new {@link Step} that has been created and started.
661
   */
662
  Step newStep(boolean silent, String name, Object... parameters);
663

664
  /**
665
   * Updates the current working directory (CWD) and configures the environment paths according to the specified parameters. This method is central to changing
666
   * the IDE's notion of where it operates, affecting where configurations, workspaces, settings, and other resources are located or loaded from.
667
   *
668
   * @param ideHome The path to the IDE home directory.
669
   */
670
  default void setIdeHome(Path ideHome) {
671

672
    setCwd(ideHome, WORKSPACE_MAIN, ideHome);
5✔
673
  }
1✔
674

675
  /**
676
   * Updates the current working directory (CWD) and configures the environment paths according to the specified parameters. This method is central to changing
677
   * the IDE's notion of where it operates, affecting where configurations, workspaces, settings, and other resources are located or loaded from.
678
   *
679
   * @param userDir The path to set as the current working directory.
680
   * @param workspace The name of the workspace within the IDE's environment.
681
   * @param ideHome The path to the IDE home directory.
682
   */
683
  void setCwd(Path userDir, String workspace, Path ideHome);
684

685
  /**
686
   * Finds the path to the Bash executable.
687
   *
688
   * @return the {@link String} to the Bash executable, or {@code null} if Bash is not found
689
   */
690
  String findBash();
691

692
  /**
693
   * Finds the path to the Bash executable.
694
   *
695
   * @return the {@link String} to the Bash executable. Throws an {@link IllegalStateException} if no bash was found.
696
   */
697
  default String findBashRequired() {
698
    String bash = findBash();
3✔
699
    if (bash == null) {
2!
700
      String message = "Could not find bash what is a prerequisite of IDEasy.";
×
701
      if (getSystemInfo().isWindows()) {
×
702
        message = message + "\nPlease install Git for Windows and rerun.";
×
703
      }
704
      throw new IllegalStateException(message);
×
705
    }
706
    return bash;
2✔
707
  }
708

709
  /**
710
   * @return the {@link WindowsPathSyntax} used for {@link Path} conversion or {@code null} for no such conversion (typically if not on Windows).
711
   */
712
  WindowsPathSyntax getPathSyntax();
713

714
  /**
715
   * logs the status of {@link #getIdeHome() IDE_HOME} and {@link #getIdeRoot() IDE_ROOT}.
716
   */
717
  void logIdeHomeAndRootStatus();
718

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