libdragon 10.7.1 → 10.8.0

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.
package/README.md CHANGED
@@ -123,6 +123,10 @@ will init the container for this project and run `make && make install` for `ed6
123
123
 
124
124
  This is an experimental dependency management.
125
125
 
126
+ ## TODOS
127
+
128
+ - [ ] Skip CI checks for irrelevant changes.
129
+
126
130
  ## Funding
127
131
 
128
132
  If this tool helped you, consider supporting its development by sponsoring it!
package/index.js CHANGED
File without changes
@@ -39,7 +39,7 @@ const printUsage = (info) => {
39
39
 
40
40
  To disable auto-vendoring, init with \`manual\`. With \`manual\`, libdragon files are expected at the location provided by \`--directory\` flag and the user is responsible for vendoring and updating them. This will allow using any other manual vendoring method.
41
41
 
42
- You can always switch to manual by re-running \`init\` with \`--strategy manual\`, though you will be responsible for managing the existing submodule/subtree. Also it is not possible to automatically switch back.
42
+ You can always switch strategy by re-running \`init\` with \`--strategy\`, though you will be responsible for handling the old vendored files as they will be kept as is.
43
43
 
44
44
  With the \`manual\` strategy, it is still recommended to have a git repository at project root such that container actions can execute faster by caching the container id inside the \`.git\` folder.\n`,
45
45
  alias: 's',
@@ -27,12 +27,99 @@ const {
27
27
  toPosixPath,
28
28
  toNativePath,
29
29
  } = require('../helpers');
30
+ const { syncImageAndStart } = require('./update-and-start');
31
+
32
+ const autoDetect = async (info) => {
33
+ const vendorTarget = path.relative(
34
+ info.root,
35
+ toNativePath(info.vendorDirectory)
36
+ );
37
+ const vendorTargetExists = await fs.stat(vendorTarget).catch((e) => {
38
+ if (e.code !== 'ENOENT') throw e;
39
+ return false;
40
+ });
41
+
42
+ if (
43
+ vendorTargetExists &&
44
+ (await runGitMaybeHost(info, [
45
+ 'submodule',
46
+ 'status',
47
+ info.vendorDirectory,
48
+ ]).catch((e) => {
49
+ if (!(e instanceof CommandError)) {
50
+ throw e;
51
+ }
52
+ }))
53
+ ) {
54
+ log(`${info.vendorDirectory} is a submodule.`);
55
+ return 'submodule';
56
+ }
57
+
58
+ if (vendorTargetExists) {
59
+ const gitLogs = await runGitMaybeHost(info, ['log'], {
60
+ inheritStdin: false,
61
+ inheritStdout: false,
62
+ inheritStderr: false,
63
+ });
64
+
65
+ if (gitLogs.includes(`git-subtree-dir: ${info.vendorDirectory}`)) {
66
+ log(`${info.vendorDirectory} is a subtree.`);
67
+ return 'subtree';
68
+ }
69
+ }
70
+ };
71
+
72
+ const autoVendor = async (info) => {
73
+ // Update the strategy information for the project if the flag is provided
74
+ if (info.options.VENDOR_STRAT) {
75
+ info.vendorStrategy = info.options.VENDOR_STRAT;
76
+ }
77
+
78
+ // Update the directory information for the project if the flag is provided
79
+ if (info.options.VENDOR_DIR) {
80
+ const relativeVendorDir = path.relative(info.root, info.options.VENDOR_DIR);
81
+ // Validate vendoring path
82
+ if (relativeVendorDir.startsWith('..')) {
83
+ throw new ParameterError(
84
+ `\`--directory=${info.options.VENDOR_DIR}\` is outside the project directory.`,
85
+ info.options.CURRENT_ACTION.name
86
+ );
87
+ }
88
+
89
+ // Immeditately convert it to a posix and relative path
90
+ info.vendorDirectory = toPosixPath(relativeVendorDir);
91
+ }
92
+
93
+ // No need to do anything here
94
+ if (info.vendorStrategy === 'manual') {
95
+ return info;
96
+ }
97
+
98
+ await runGitMaybeHost(info, ['init']);
99
+ const detectedStrategy = await autoDetect(info);
100
+
101
+ if (
102
+ info.options.VENDOR_STRAT &&
103
+ detectedStrategy &&
104
+ detectedStrategy !== info.options.VENDOR_STRAT
105
+ ) {
106
+ throw new ValidationError(
107
+ `${info.vendorDirectory} is a ${detectedStrategy} which is different from the provided strategy: ${info.options.VENDOR_STRAT}.`
108
+ );
109
+ }
30
110
 
31
- const autoVendor = async (libdragonInfo) => {
32
- await runGitMaybeHost(libdragonInfo, ['init']);
111
+ if (detectedStrategy) {
112
+ log(
113
+ `Using ${info.vendorDirectory} as a ${detectedStrategy} vendoring target.`
114
+ );
115
+ return {
116
+ ...info,
117
+ vendorStrategy: detectedStrategy,
118
+ };
119
+ }
33
120
 
34
- if (libdragonInfo.vendorStrategy === 'submodule') {
35
- await runGitMaybeHost(libdragonInfo, [
121
+ if (info.vendorStrategy === 'submodule') {
122
+ await runGitMaybeHost(info, [
36
123
  'submodule',
37
124
  'add',
38
125
  '--force',
@@ -41,19 +128,22 @@ const autoVendor = async (libdragonInfo) => {
41
128
  '--branch',
42
129
  LIBDRAGON_BRANCH,
43
130
  LIBDRAGON_GIT,
44
- libdragonInfo.vendorDirectory,
131
+ info.vendorDirectory,
45
132
  ]);
46
- } else if (libdragonInfo.vendorStrategy === 'subtree') {
133
+ return info;
134
+ }
135
+
136
+ if (info.vendorStrategy === 'subtree') {
47
137
  // Create a commit if it does not exist. This is required for subtree.
48
138
  try {
49
- await runGitMaybeHost(libdragonInfo, ['rev-parse', 'HEAD']);
139
+ await runGitMaybeHost(info, ['rev-parse', 'HEAD']);
50
140
  } catch (e) {
51
141
  if (!(e instanceof CommandError)) throw e;
52
142
 
53
143
  // This will throw if git user name/email is not set up. Let's not assume
54
144
  // anything for now. This means subtree is not supported for someone without
55
145
  // git on the host machine.
56
- await runGitMaybeHost(libdragonInfo, [
146
+ await runGitMaybeHost(info, [
57
147
  'commit',
58
148
  '--allow-empty',
59
149
  '-n',
@@ -62,18 +152,17 @@ const autoVendor = async (libdragonInfo) => {
62
152
  ]);
63
153
  }
64
154
 
65
- await runGitMaybeHost(libdragonInfo, [
155
+ await runGitMaybeHost(info, [
66
156
  'subtree',
67
157
  'add',
68
158
  '--prefix',
69
- path.relative(libdragonInfo.root, libdragonInfo.vendorDirectory),
159
+ path.relative(info.root, info.vendorDirectory),
70
160
  LIBDRAGON_GIT,
71
161
  LIBDRAGON_BRANCH,
72
162
  '--squash',
73
163
  ]);
164
+ return info;
74
165
  }
75
-
76
- return libdragonInfo;
77
166
  };
78
167
 
79
168
  /**
@@ -83,10 +172,8 @@ const autoVendor = async (libdragonInfo) => {
83
172
  async function init(info) {
84
173
  log(`Initializing a libdragon project at ${info.root}`);
85
174
 
86
- let newInfo = info;
87
-
88
175
  // Validate manifest
89
- const manifestPath = path.join(newInfo.root, LIBDRAGON_PROJECT_MANIFEST);
176
+ const manifestPath = path.join(info.root, LIBDRAGON_PROJECT_MANIFEST);
90
177
  const manifestStats = await fs.stat(manifestPath).catch((e) => {
91
178
  if (e.code !== 'ENOENT') throw e;
92
179
  return false;
@@ -98,95 +185,52 @@ async function init(info) {
98
185
  );
99
186
  }
100
187
 
101
- // Validate vendoring strategy. Do not allow a switch after successful initialization
102
- if (
103
- newInfo.haveProjectConfig &&
104
- newInfo.options.VENDOR_STRAT &&
105
- newInfo.options.VENDOR_STRAT !== 'manual' &&
106
- newInfo.vendorStrategy !== newInfo.options.VENDOR_STRAT
107
- ) {
108
- throw new ParameterError(
109
- `Requested strategy switch: ${newInfo.vendorStrategy} -> ${newInfo.options.VENDOR_STRAT} It is not possible to switch vendoring strategy after initializing a project. You can always switch to manual and handle libdragon yourself.`,
110
- info.options.CURRENT_ACTION.name
111
- );
112
- }
113
-
114
- // Update the strategy information for the project if the flag is provided
115
- if (newInfo.options.VENDOR_STRAT) {
116
- newInfo.vendorStrategy = newInfo.options.VENDOR_STRAT;
117
- }
118
-
119
- // Update the directory information for the project if the flag is provided
120
- if (newInfo.options.VENDOR_DIR) {
121
- const relativeVendorDir = path.relative(info.root, info.options.VENDOR_DIR);
122
- // Validate vendoring path
123
- if (relativeVendorDir.startsWith('..')) {
124
- throw new ParameterError(
125
- `\`--directory=${info.options.VENDOR_DIR}\` is outside the project directory.`,
126
- info.options.CURRENT_ACTION.name
127
- );
128
- }
129
-
130
- // Immeditately convert it to a posix and relative path
131
- newInfo.vendorDirectory = toPosixPath(relativeVendorDir);
132
- }
133
-
134
- if (newInfo.haveProjectConfig) {
188
+ if (info.haveProjectConfig) {
135
189
  log(
136
190
  `${path.join(
137
- newInfo.root,
191
+ info.root,
138
192
  LIBDRAGON_PROJECT_MANIFEST
139
193
  )} exists. This is already a libdragon project, starting it...`
140
194
  );
141
- if (newInfo.options.DOCKER_IMAGE) {
195
+ if (info.options.DOCKER_IMAGE) {
142
196
  log(
143
197
  `Not changing docker image. Use the install action if you want to override the image.`
144
198
  );
145
199
  }
146
- // TODO: we may make sure git and submodule is initialized here
147
- return await install(newInfo);
200
+ if (info.options.DOCKER_IMAGE) {
201
+ info = await syncImageAndStart(info);
202
+ } else {
203
+ info = {
204
+ ...info,
205
+ containerId: await start(info),
206
+ };
207
+ }
208
+ info = await autoVendor(info);
209
+ await installDependencies(info);
210
+ return info;
148
211
  }
149
212
 
150
- await updateImage(newInfo, newInfo.imageName);
213
+ await updateImage(info, info.imageName);
151
214
 
152
215
  // Download image and start it
153
- newInfo.containerId = await start(newInfo);
216
+ info.containerId = await start(info);
154
217
 
155
218
  // We have created a new container, save the new info ASAP
156
- await initGitAndCacheContainerId(newInfo);
219
+ await initGitAndCacheContainerId(info);
157
220
 
158
- if (newInfo.vendorStrategy !== 'manual') {
159
- const vendorTarget = path.relative(
160
- newInfo.root,
161
- toNativePath(newInfo.vendorDirectory)
162
- );
163
- const vendorTargetExists = await fs.stat(vendorTarget).catch((e) => {
164
- if (e.code !== 'ENOENT') throw e;
165
- return false;
166
- });
167
-
168
- if (vendorTargetExists) {
169
- throw new ValidationError(
170
- `${path.resolve(
171
- vendorTarget
172
- )} already exists. That is the libdragon vendoring target, please remove and retry.`
173
- );
174
- }
175
-
176
- newInfo = await autoVendor(newInfo);
177
- }
221
+ info = await autoVendor(info);
178
222
 
179
223
  log(`Preparing project files...`);
180
224
  const skeletonFolder = path.join(__dirname, '../../skeleton');
181
225
 
182
226
  await Promise.all([
183
- installDependencies(newInfo),
227
+ installDependencies(info),
184
228
  // node copy functions does not work with pkg
185
- copyDirContents(skeletonFolder, newInfo.root),
229
+ copyDirContents(skeletonFolder, info.root),
186
230
  ]);
187
231
 
188
- log(chalk.green(`libdragon ready at \`${newInfo.root}\`.`));
189
- return newInfo;
232
+ log(chalk.green(`libdragon ready at \`${info.root}\`.`));
233
+ return info;
190
234
  }
191
235
 
192
236
  module.exports = {
@@ -200,7 +244,9 @@ module.exports = {
200
244
 
201
245
  By default, a git repository and a submodule at \`./libdragon\` will be created to automatically update the vendored libdragon files on subsequent \`update\`s. If you intend to opt-out from this feature, see the \`--strategy manual\` flag to provide your self-managed libdragon copy. The default behaviour is intended for users who primarily want to consume libdragon as is.
202
246
 
203
- If this is the first time you are creating a libdragon project at that location, this action will also create skeleton project files to kickstart things with the given image, if provided. For subsequent runs, it will act like \`start\` thus can be used to revive an existing project without modifying it.`,
247
+ If this is the first time you are creating a libdragon project at that location, this action will also create skeleton project files to kickstart things with the given image, if provided. For subsequent runs, it will act like \`start\` thus can be used to revive an existing project without modifying it.
248
+
249
+ If you have an existing project with an already vendored submodule or subtree libdragon copy, \`init\` will automatically detect it at the provided \`--directory\`.`,
204
250
  group: ['docker', 'vendoring'],
205
251
  },
206
252
  };
@@ -2,7 +2,7 @@ const chalk = require('chalk').stderr;
2
2
 
3
3
  const { installDependencies } = require('./utils');
4
4
  const { start } = require('./start');
5
- const { updateAndStart } = require('./update-and-start');
5
+ const { syncImageAndStart } = require('./update-and-start');
6
6
  const { log } = require('../helpers');
7
7
 
8
8
  /**
@@ -16,17 +16,17 @@ const { log } = require('../helpers');
16
16
  * depends on it. It used to only update the image if the flag is provided and
17
17
  * we still keep that logic but with a deprecation warning.
18
18
  */
19
- const install = async (libdragonInfo, skipUpdate) => {
19
+ const install = async (libdragonInfo) => {
20
20
  let updatedInfo = libdragonInfo;
21
21
  const imageName = libdragonInfo.options.DOCKER_IMAGE;
22
22
  // If an image is provided, attempt to install
23
- if (imageName && skipUpdate !== true) {
23
+ if (imageName) {
24
24
  log(
25
25
  chalk.yellow(
26
26
  'Using `install` action to update the docker image is deprecated. Use the `update` action instead.'
27
27
  )
28
28
  );
29
- updatedInfo = await updateAndStart(libdragonInfo);
29
+ updatedInfo = await syncImageAndStart(libdragonInfo);
30
30
  } else {
31
31
  // Make sure existing one is running
32
32
  updatedInfo = {
@@ -34,19 +34,20 @@ const initContainer = async (libdragonInfo) => {
34
34
  ])
35
35
  ).trim();
36
36
 
37
- const newInfo = {
38
- ...libdragonInfo,
39
- containerId: newId,
40
- };
41
-
42
37
  // chown the installation folder once on init
43
38
  const { uid, gid } = libdragonInfo.userInfo;
44
- await dockerExec(newInfo, [
45
- 'chown',
46
- '-R',
47
- `${uid >= 0 ? uid : ''}:${gid >= 0 ? gid : ''}`,
48
- '/n64_toolchain',
49
- ]);
39
+ await dockerExec(
40
+ {
41
+ ...libdragonInfo,
42
+ containerId: newId,
43
+ },
44
+ [
45
+ 'chown',
46
+ '-R',
47
+ `${uid >= 0 ? uid : ''}:${gid >= 0 ? gid : ''}`,
48
+ '/n64_toolchain',
49
+ ]
50
+ );
50
51
  } catch (e) {
51
52
  // Dispose the invalid container, clean and exit
52
53
  await destroyContainer({
@@ -2,7 +2,7 @@ const { log } = require('../helpers');
2
2
  const { updateImage, destroyContainer } = require('./utils');
3
3
  const { start } = require('./start');
4
4
 
5
- async function updateAndStart(libdragonInfo) {
5
+ async function syncImageAndStart(libdragonInfo) {
6
6
  const oldImageName = libdragonInfo.imageName;
7
7
  const imageName = libdragonInfo.options.DOCKER_IMAGE ?? oldImageName;
8
8
  // If an image is provided, always attempt to install it
@@ -29,5 +29,5 @@ async function updateAndStart(libdragonInfo) {
29
29
  }
30
30
 
31
31
  module.exports = {
32
- updateAndStart,
32
+ syncImageAndStart,
33
33
  };
@@ -1,26 +1,25 @@
1
1
  const { log } = require('../helpers');
2
2
  const { LIBDRAGON_GIT, LIBDRAGON_BRANCH } = require('../constants');
3
- const { runGitMaybeHost } = require('./utils');
4
- const { fn: install } = require('./install');
5
- const { updateAndStart } = require('./update-and-start');
3
+ const { runGitMaybeHost, installDependencies } = require('./utils');
4
+ const { syncImageAndStart } = require('./update-and-start');
6
5
 
7
6
  const update = async (info) => {
8
- const newInfo = await updateAndStart(info);
7
+ info = await syncImageAndStart(info);
9
8
 
10
- if (newInfo.vendorStrategy !== 'manual') {
11
- log(`Updating ${newInfo.vendorStrategy}...`);
9
+ if (info.vendorStrategy !== 'manual') {
10
+ log(`Updating ${info.vendorStrategy}...`);
12
11
  }
13
12
 
14
- if (newInfo.vendorStrategy === 'submodule') {
15
- await runGitMaybeHost(newInfo, [
13
+ if (info.vendorStrategy === 'submodule') {
14
+ await runGitMaybeHost(info, [
16
15
  'submodule',
17
16
  'update',
18
17
  '--remote',
19
18
  '--merge',
20
- newInfo.vendorDirectory,
19
+ info.vendorDirectory,
21
20
  ]);
22
- } else if (newInfo.vendorStrategy === 'subtree') {
23
- await runGitMaybeHost(newInfo, [
21
+ } else if (info.vendorStrategy === 'subtree') {
22
+ await runGitMaybeHost(info, [
24
23
  'subtree',
25
24
  'pull',
26
25
  '--prefix',
@@ -31,9 +30,7 @@ const update = async (info) => {
31
30
  ]);
32
31
  }
33
32
 
34
- // The second parameter forces it to skip the image update step as we already
35
- // do that above.
36
- return await install(newInfo, true);
33
+ await installDependencies(info);
37
34
  };
38
35
 
39
36
  module.exports = {
@@ -110,35 +110,35 @@ const destroyContainer = async (libdragonInfo) => {
110
110
  * Invokes host git with provided params. If host does not have git, falls back
111
111
  * to the docker git, with the nix user set to the user running libdragon.
112
112
  */
113
- async function runGitMaybeHost(libdragonInfo, params) {
113
+ async function runGitMaybeHost(libdragonInfo, params, options = {}) {
114
114
  assert(
115
115
  libdragonInfo.vendorStrategy !== 'manual',
116
116
  new Error('Should never run git if vendoring strategy is manual.')
117
117
  );
118
118
  try {
119
119
  const isWin = /^win/.test(process.platform);
120
- await spawnProcess(
120
+ return await spawnProcess(
121
121
  'git',
122
122
  ['-C', libdragonInfo.root, ...params],
123
123
  // Windows git is breaking the TTY somehow - disable TTY for now
124
124
  // We are not able to display progress for the initial clone b/c of this
125
125
  // Enable progress otherwise.
126
126
  isWin
127
- ? { inheritStdin: false }
128
- : { inheritStdout: true, inheritStderr: true }
127
+ ? { inheritStdin: false, ...options }
128
+ : { inheritStdout: true, inheritStderr: true, ...options }
129
129
  );
130
130
  } catch (e) {
131
131
  if (e instanceof CommandError) {
132
132
  throw e;
133
133
  }
134
134
 
135
- await dockerExec(
135
+ return await dockerExec(
136
136
  libdragonInfo,
137
137
  // Use the host user when initializing git as we will need access
138
138
  [...dockerHostUserParams(libdragonInfo)],
139
139
  ['git', ...params],
140
140
  // Let's enable tty here to show the progress
141
- { inheritStdout: true, inheritStderr: true }
141
+ { inheritStdout: true, inheritStderr: true, ...options }
142
142
  );
143
143
  }
144
144
  }
@@ -66,12 +66,14 @@ async function findContainerId(libdragonInfo) {
66
66
  const idIndex = str.indexOf(shortId);
67
67
  const longId = str.slice(idIndex, idIndex + 64);
68
68
  if (longId.length === 64) {
69
- const newInfo = { ...libdragonInfo, containerId: longId };
70
69
  // This shouldn't happen but if the user somehow deleted the .git folder
71
70
  // (we don't have the container id file at this point) we can recover the
72
71
  // project. `git init` is safe anyways and it is not executed if strategy
73
72
  // is `manual`
74
- await initGitAndCacheContainerId(newInfo);
73
+ await initGitAndCacheContainerId({
74
+ ...libdragonInfo,
75
+ containerId: longId,
76
+ });
75
77
  return longId;
76
78
  }
77
79
  }
package/package.json CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "name": "libdragon",
3
- "version": "10.7.1",
3
+ "version": "10.8.0",
4
4
  "description": "This is a docker wrapper for libdragon",
5
5
  "main": "index.js",
6
6
  "engines": {
7
- "node": ">=14"
7
+ "node": ">=14",
8
+ "npm": ">=8"
8
9
  },
9
10
  "bin": {
10
11
  "libdragon": "./index.js"
@@ -39,10 +40,19 @@
39
40
  "lodash": "^4.17.20"
40
41
  },
41
42
  "devDependencies": {
43
+ "@semantic-release/changelog": "^6.0.1",
44
+ "@semantic-release/exec": "^6.0.3",
45
+ "@semantic-release/git": "^10.0.1",
46
+ "commitizen": "^4.2.4",
47
+ "cz-conventional-changelog": "^3.3.0",
42
48
  "ed64": "^2.0.4",
43
49
  "eslint": "^7.32.0",
44
50
  "pkg": "^5.5.2",
45
- "prettier": "^2.4.0"
51
+ "prettier": "^2.4.0",
52
+ "semantic-release": "^19.0.2"
53
+ },
54
+ "overrides": {
55
+ "minimist": "1.2.6"
46
56
  },
47
57
  "pkg": {
48
58
  "targets": [
@@ -53,5 +63,44 @@
53
63
  "assets": [
54
64
  "skeleton/**"
55
65
  ]
66
+ },
67
+ "release": {
68
+ "plugins": [
69
+ "@semantic-release/commit-analyzer",
70
+ "@semantic-release/release-notes-generator",
71
+ "@semantic-release/changelog",
72
+ "@semantic-release/npm",
73
+ "@semantic-release/git",
74
+ [
75
+ "@semantic-release/exec",
76
+ {
77
+ "prepareCmd": "./pack.sh"
78
+ }
79
+ ],
80
+ [
81
+ "@semantic-release/github",
82
+ {
83
+ "assets": [
84
+ {
85
+ "path": "libdragon-linux-x86_64.tar.gz",
86
+ "label": "Linux executable"
87
+ },
88
+ {
89
+ "path": "libdragon-macos-x86_64.tar.gz",
90
+ "label": "MacOS executable"
91
+ },
92
+ {
93
+ "path": "libdragon-win-x86_64.zip",
94
+ "label": "Windows executable"
95
+ }
96
+ ]
97
+ }
98
+ ]
99
+ ]
100
+ },
101
+ "config": {
102
+ "commitizen": {
103
+ "path": "./node_modules/cz-conventional-changelog"
104
+ }
56
105
  }
57
106
  }
package/CHANGELOG.md DELETED
@@ -1,582 +0,0 @@
1
- # Change Log
2
-
3
- ## [10.7.1] - 2022-04-20
4
-
5
- ### Fixed
6
-
7
- - Migrating from and old version was incorrectly erroring out to do an additional
8
- `init`, which is not necessarily required.
9
-
10
- ### Changed
11
-
12
- - Do not print usage information when a command fails.
13
-
14
- ## [10.7.0] - 2022-04-17
15
-
16
- ### Fixed
17
-
18
- - Logs properly goes to stderr now. Previously they were written to stdout. This
19
- means the id output of the `start` action is now written to stdout while we can
20
- also display other information on the terminal. This allowed enabling the docker
21
- logs for a more responsive experience. The output of `help` still goes to stdout.
22
-
23
- ### Added
24
-
25
- - Stdin consumption support. Now it is possible to pipe anything to `exec` and
26
- it will pass it through to the target. In case of no running container, it will
27
- keep a copy of the stdin stream until the docker process is ready. This enables
28
- piping in data from the host if ever needed for some reason. This enables usages
29
- like `cat file.txt | libdragon exec cat - | less`.
30
- - Automatically convert host paths into posix format so that the user can use
31
- the host's path autocompletion. It will also convert absolute host paths into
32
- relative container paths automatically. Previously all paths were assumed to be
33
- container paths relative to the location corresponding to the host cwd.
34
- Closes #24.
35
-
36
- ### Changed
37
-
38
- - Refactored process spawns.
39
- - Refactored main flow and separated parsing logic.
40
- - Reorder actions & correction on flag usage for help output.
41
- - Setting `--verbose` for `start` does not guarantee the only-id output anymore.
42
- - Refactored parameter parsing.
43
- - Update submdule for local development.
44
-
45
- ## [10.6.0] - 2022-04-09
46
- ### Fixed
47
-
48
- - Fix a path bug that would cause incorrect behaviour when the command is run
49
- deeper than a single level in the project folder.
50
- - Fix a potential issue where `build.sh`might be incorrectly found inexistant
51
- if the OS is picky about the paths to have native separators.
52
- - Only save project information when necessary. Previously actions like `help`
53
- were saving project info mistakenly.
54
-
55
- ### Added
56
-
57
- - `disasm` action to simplify disassembling ELF files generated by the toolchain.
58
- - `version` action to display current version.
59
- - `destroy` action to remove the libdragon project.
60
- - Additional documentation for flags.
61
- - Print duration information when verbose.
62
-
63
- ### Changed
64
-
65
- - Refactored out NPM related functions.
66
- - Moved usage parameters to respective actions files as a refactor.
67
- - It is possible to provide an absolute path to init `--directory` as long as it
68
- is inside the project directory. Previously it was possible to provide somewhere
69
- outside the project, but it would fail with an unexpected error.
70
- - Simplify saving mechanism. Each action now internally resolves into the data
71
- to save if any.
72
-
73
- ## [10.4.2] - 2022-04-03
74
-
75
- ### Fixed
76
-
77
- - Make sure actions depending on an `init` fail in a non-project directory to
78
- keep the project state consistent. This fixes #51.
79
- - `update` action now tries to update the toolchain image as well. Previously
80
- this was not the case contrary to what someone would expect. Considering it won't
81
- change the behaviour for non-latest images and the toolchain did not have any
82
- breaking changes for a long time, this is not considered a breaking change either.
83
- - `start` action was printing stuff other than the container id. It doesn't
84
- anymore.
85
- - Stop unnecessarily printing container id and a few messages related to updates.
86
- - Fix a potential race condition that might cause unexpected failures.
87
- - Correct some errors' exit codes.
88
- ### Added
89
-
90
- - A new exit code (`4`) to represent unexpected conditions.
91
-
92
- ### Changed
93
-
94
- - Deprecated providing the image flag for `install` action by displaying a
95
- warning and removing it from documentation, without changing behaviour even
96
- though it is higly unlikely this feature was ever used. It mainly exists for
97
- historical reasons and it wil be removed in next major release.
98
- - Update documentation to warn against changing strategy is a one way operation.
99
- - Update documentation to reflect `update` action changes.
100
- - Minor refactors.
101
- - Update submodule for local environment.
102
-
103
- ## [10.4.1] - 2022-03-23
104
-
105
- ### Fixed
106
-
107
- - Update the root makefile to utilize `SOURCE_DIR` for example builds. Then we are
108
- able to map container files to local files properly with a generic regex in the
109
- problem matcher. This fixes #13 and does not change any behaviour.
110
- - Add missing examples to the vscode run configurations.
111
- - Install and build libdragon related things in the container when `exec` and
112
- `make` causes a new container run. This was previously prevented on `v10.3.1`
113
- because it was unnecessarily delaying all exec operations when the container
114
- is started. Refactoring things allowed me to realize this can be improved
115
- instead of forcing the user to do a manual `install`.
116
- - Fix a potential issue that may cause the git commands to run in current folder
117
- instead of the project root.
118
- - Attach the error handler once for spawnProcess.
119
- - Update vulnerable dependencies.
120
-
121
- ### Added
122
-
123
- - `--directory` option to customize vendoring location.
124
- - `--strategy` option to select a vendoring strategy. Currently supported options
125
- are `submodule`, `subtree` and `manual`. The default is `submodule` and `manual`
126
- can be used to opt-out of auto vendoring. Useful if the user wants to utilize
127
- a different vendoring strategy and opt-out of the auto-managed git flows.
128
-
129
- ### Changed
130
-
131
- - Migrate to a json file for persistent project information.
132
- - Only save the configuration file on successful exit except for the initial
133
- migration.
134
- - Do not prevent init if there is a file named libdragon in the target folder.
135
- This used to cause problems on windows but I cannot reproduce it anymore
136
- with `2.33.1.windows.1`. It may be something caused by my old configuration.
137
- - Minor performance improvements.
138
-
139
- ## [10.3.1] - 2022-01-25
140
-
141
- ### Fixed
142
-
143
- - Do not try to parse arguments after exec/make. They used to get evaluated as
144
- libdragon paramaters previously, preventing passing down -v to the container
145
- make for example.
146
- - Docker image update issues
147
- - Attempt an image update whenever the image flag is provided. Previously this
148
- was only done if a different image name is provided, preventing the update of
149
- the latest image. Previously not providing an image name was behaving the same
150
- so this is not a breaking change.
151
- - Start action used to update the image if provided but this bug was already
152
- prevented by previous fixes by not accepting the image flag for actions other
153
- than init/update/install. Start action no longer tries to update the image
154
- regardless.
155
-
156
- ### Changed
157
-
158
- - Only accept the image flag for init, install, and update actions as documented.
159
- - Improve documentation for the `init` and `install` actions.
160
- - Do not attempt an `install` when running `exec`, just start the container. If
161
- there is a half-baked container, a manual `install` will potentially restore it.
162
- - Update libdragon.
163
-
164
- ### Added
165
-
166
- - Extra information for skipping the image flag when doing init for an already
167
- initialized project.
168
-
169
- ## [10.3.0] - 2022-01-20
170
-
171
- ### Changed
172
-
173
- - Update dependencies.
174
- - Detailed help output.
175
- - Move action descriptions to `libdragon help`.
176
- - Update libdragon to latest version for local build.
177
-
178
- ### Added
179
-
180
- - Shorthand flag support.
181
-
182
- ## [10.2.1] - 2021-10-14
183
-
184
- ### Changed
185
-
186
- - Updated ed64.
187
-
188
- ### Fixed
189
-
190
- - Fix skeleton project to match latest libdragon.
191
-
192
- ## [10.2.0] - 2021-10-10
193
-
194
- ### Added
195
-
196
- - Container discovery. The tool can now find a container even if `.git` is lost.
197
- - A few additional error messages for some potentially confusing cases such as
198
- already having a file with `libdragon` like name.
199
-
200
- ### Changed
201
-
202
- - Show more output for downloading the container and initial git operations.
203
- - Remove an extra log during initialization.
204
- - The submodule was always being initialized when a container is started. This
205
- was making some actions inconsistent. For example `install` or `make` action
206
- was trying to re-initialize the submodule unnecessarily. This is fixed by only
207
- initializing it with the `init` action. If any of those need to re-init the
208
- container, now they assume there is an intact libdragon folder to use.
209
- - Similarly a git repository is not initialized unnecessarily anymore.
210
- - `update` and `install` are now able to start containers if necessary.
211
- - Always try to copy skeleton files, they won't overwrite anything already.
212
- - Do not re-initialize if there is a `.libdragon` folder. We now only try to
213
- start it in this case. If it is not a complete container, it can probably be
214
- recovered by a `libdragon install` or `libdragon update`.
215
-
216
- ### Fixed
217
-
218
- - Fix wording for libdragon install on the container.
219
- - Improve image name persitence such that the tool finds and updates it more
220
- consistently.
221
-
222
- ## [10.1.0] - 2021-10-07
223
-
224
- ### Added
225
-
226
- - `exec` action to execute arbitrary commands in the container with TTY support.
227
- This also improves the color output support as docker now knows it is using TTY.
228
- - Add more verbose logging for skeleton project copy.
229
-
230
- ### Changed
231
-
232
- - Removed partially not working `--byte-swap` option. It does not already work
233
- with the new libdragon build system so there is no need keeping it in the tool.
234
-
235
- ### Fixed
236
-
237
- - Publish skeleton project files to NPM.
238
-
239
- ## [10.0.0] - 2021-10-04
240
-
241
- ### Changed
242
-
243
- - A complete re-write of the tool. Check documentation for the new usage. It is
244
- much more straightforward to use now. `libdragon make` behaves almost the same.
245
-
246
- ## [9.0.0] - 2021-09-06
247
-
248
- ### Changed
249
-
250
- - Updated libdragon. We will be changing the update mechanism to be based on a
251
- git pull, so listing them here will not be useful anymore, let's not bother now.
252
- - Start using the new build system.
253
- - Update node engine spec to be at least 14.
254
- - Added minimum docker version to readme.
255
-
256
- ### Added
257
-
258
- - Github actions integration
259
- - Start building a standalone Windows executable
260
-
261
- ### Fixed
262
-
263
- - Fixed changelog dates to ISO8601
264
-
265
- ## [8.0.0] - 2021-07-28
266
-
267
- ### Changed
268
-
269
- - Removed make, download, init, buildDragon, prepareDragon, and installDependencies NPM scripts
270
- - Update the necessary vscode and travis configuration
271
- - Update the readme to match - this also fixes #31
272
- - Improve fastpath of dfs_read (https://github.com/DragonMinded/libdragon/pull/133)
273
- - Refactor n64tool (https://github.com/DragonMinded/libdragon/pull/153, https://github.com/DragonMinded/libdragon/pull/155)
274
- - It no longer support byte-swapping and only generates a z64 file.
275
- - Change test bench Makefile to reflect latest changes
276
-
277
- ### Fixed
278
-
279
- - Zero-initialize the token array to avoid -Werror=maybe-uninitialized (https://github.com/DragonMinded/libdragon/pull/134)
280
- - Initialize arguments to main libdragon entrypoint (https://github.com/DragonMinded/libdragon/pull/136)
281
- - SD support fixes and dragonfs fopen fix (https://github.com/DragonMinded/libdragon/pull/137)
282
- - lib/include paths in tests Makefile (https://github.com/DragonMinded/libdragon/pull/138)
283
- - Reenable test_timer_ticks for emulators (https://github.com/DragonMinded/libdragon/pull/140)
284
- - n64tool: return error in case the seek offset required backward seek (https://github.com/DragonMinded/libdragon/pull/144)
285
- - Add missing extern "C" in debug.h (https://github.com/DragonMinded/libdragon/pull/146)
286
- - Ensure C++ global constructors are not garbage collected by ld (https://github.com/DragonMinded/libdragon/pull/148)
287
- - Fix clipped RDP rectangle drawing (https://github.com/DragonMinded/libdragon/pull/147)
288
- - Enable byte swap flag for the make action and update documentation accordingly
289
- - Skip the second parameter to the libdragon command as well
290
- - Enable --byte-swap flag for the make action
291
-
292
- ### Added
293
-
294
- - restart_timer and new_timer_stopped functions (https://github.com/DragonMinded/libdragon/pull/131)
295
- - dfs_rom_addr (https://github.com/DragonMinded/libdragon/pull/133)
296
- - Implement EEPROM Filesystem and test ROM (https://github.com/DragonMinded/libdragon/pull/125)
297
- - ed64romconfig binary (https://github.com/DragonMinded/libdragon/pull/153, https://github.com/DragonMinded/libdragon/pull/155)
298
- - Support for RTC status/read/write commands (https://github.com/DragonMinded/libdragon/pull/152)
299
- - Generic libdragon NPM script
300
-
301
- ## [7.0.0] - 2021-06-06
302
-
303
- ### Changed
304
-
305
- - Update GCC (10.2.0), binutils (2.36.1) and newlib (4.1.0) (https://github.com/DragonMinded/libdragon/pull/130)
306
- - Remove internal forceLatest parameter
307
- - Refactor internal constants
308
- - Update dependencies
309
-
310
- ### Fixed
311
-
312
- - Free stdio file handles when closed (https://github.com/DragonMinded/libdragon/pull/128)
313
-
314
- ### Added
315
-
316
- - Default exception handler (https://github.com/DragonMinded/libdragon/pull/126)
317
- - New debugging library (https://github.com/DragonMinded/libdragon/pull/130)
318
- - Not final, may have bugs or it may change in the future
319
-
320
- ## [6.0.2] - 2021-03-04
321
-
322
- ### Fixed
323
-
324
- - Fix icache ops (https://github.com/DragonMinded/libdragon/pull/122)
325
- - Rewrite timer.c to avoid messing up the COP0 hardware counter (https://github.com/DragonMinded/libdragon/pull/123)
326
- - Fix 16k EEPROM detection (https://github.com/DragonMinded/libdragon/pull/124)
327
-
328
- ### Added
329
-
330
- - Support GCC nested functions (https://github.com/DragonMinded/libdragon/pull/122)
331
-
332
- ## [6.0.1] - 2021-02-07
333
-
334
- ### Changed
335
-
336
- - Makefile: add -ffunction-sections and -fdata-sections to libdragon (https://github.com/DragonMinded/libdragon/pull/121)
337
- - Running vscode tasks now always rebuild libdragon examples and tests
338
- - Root makefile always rebuilds examples and tests
339
- - Update readme
340
-
341
- ### Fixed
342
-
343
- - C++ test example works now (https://github.com/DragonMinded/libdragon/pull/118)
344
- - Delay functions work correctly now (https://github.com/DragonMinded/libdragon/pull/120)
345
- - Fix broken bench makefile
346
- - Fix incorrect rom name for resolution test vscode launch configuration
347
-
348
- ### Added
349
-
350
- - `installDragon` vscode task to make and install libdragon to the container
351
-
352
- ## [6.0.0] - 2021-01-23
353
-
354
- ### Changed
355
-
356
- - Update base Dockerfile to use the latest toolchain setup and make it deduce processor count for the toolchain build
357
- - `make` action does not first restart the container anymore. This will result in minor performance gains when running make
358
- - `libdragon` command does not always exit with code 1 anymore, it instead echoes the underlying error code if known
359
- - Updated toolchain dockerfile to strip symbols from executables and remove locales and built a new base image. Closes #8
360
- - Move code into modules
361
- - Do not put unnecessary files into the NPM package
362
- - Renamed `dragonInstall` npm script to `prepareDragon`
363
- - Readme improvements
364
-
365
- ### Fixed
366
-
367
- - Start using child_process spawn to prevent buffer issues. Fixes #2
368
- - Colors are now properly displayed when using the wrapper. Fixes #21
369
-
370
- ### Added
371
-
372
- - Readme update instructions. Closes #20
373
- - Readme root makefile instructions
374
- - A red message to show the error if any, including subprocess exit codes
375
- - An additional `installDependencies` libdragon action and NPM script. It does what we used to do after `download` and `start` when running `install`
376
- - `-fdiagnostics-color` for the local test bench to enable color output
377
-
378
- ## [5.0.0] - 2021-01-16
379
-
380
- ### Changed
381
-
382
- - dfs: fix performance of dfs_seek to be constant-time (https://github.com/DragonMinded/libdragon/pull/115)
383
- - This changes the file system layout
384
-
385
- ### Fixed
386
-
387
- - n64sys: fix dma cache ops (https://github.com/DragonMinded/libdragon/pull/116)
388
- - Added a new root makefile to batch multiple operations. Fixes #10
389
- - Added local search paths to improve test bench compile time. Fixes #18
390
-
391
- ### Added
392
-
393
- - Exposed the TV_TYPE at 0x80000300 as a n64sys function (https://github.com/DragonMinded/libdragon/pull/113)
394
- - Initial libdragon testsuite (https://github.com/DragonMinded/libdragon/pull/117)
395
- - Launch configurations for the new test suite and existing examples
396
- - Launch configuration to clean everything
397
-
398
- ## [4.1.4] - 2020-12-31
399
-
400
- ### Changed
401
-
402
- - Update readme for submodule update procedure (https://github.com/anacierdem/libdragon-docker/pull/17)
403
-
404
- ### Fixed
405
-
406
- - Prevent newlines in the output (https://github.com/anacierdem/libdragon-docker/pull/19)
407
-
408
- ## [4.1.3] - 2020-12-16
409
-
410
- ### Changed
411
-
412
- - Removed broken patreon shield. This is only a readme change.
413
-
414
- ## [4.1.2] - 2020-12-15
415
-
416
- ### Changed
417
-
418
- - Updated readme on how to use this repository.
419
- - Update dependencies.
420
- - Update ed64 to `1.2.0`.
421
-
422
- ### Fixed
423
-
424
- - n64tool: fix bug in detection of unaligned image sizes (https://github.com/DragonMinded/libdragon/pull/109)
425
- - tools/build: Set default number of jobs to number of processors (https://github.com/DragonMinded/libdragon/pull/111)
426
- - Build script fixes (https://github.com/DragonMinded/libdragon/pull/112)
427
-
428
- ## [4.1.1] - 2020-10-05
429
-
430
- ### Changed
431
-
432
- - Updated readme on how to use this repository. Fixes #14.
433
- - Update dependencies.
434
-
435
- ### Fixed
436
-
437
- - Fix examples' n64tool argument order. (https://github.com/DragonMinded/libdragon/pull/103)
438
- - Change ucodetest Makefile mode from 775 to 644. (https://github.com/DragonMinded/libdragon/pull/104)
439
-
440
- ## [4.1.0] - 2019-05-21
441
-
442
- ### Fixed
443
-
444
- - RSP macros now supports negative offsets. (https://github.com/DragonMinded/libdragon/pull/99)
445
- - Exception handler properly works and sets cause register to `cr` on `reg_block_t`. (https://github.com/DragonMinded/libdragon/pull/95)
446
- - Padding on data sections were causing boot issues. They are properly padded. (https://github.com/DragonMinded/libdragon/pull/98)
447
- - n64tool: Broken ROM issue is fixed when doing byte-swapping or zero-padding. (https://github.com/DragonMinded/libdragon/pull/97)
448
- - GCC 10 support with default `-fno-common`. (https://github.com/DragonMinded/libdragon/pull/96)
449
-
450
- ### Added
451
-
452
- - Exception cause map is now implemented and it is accessible via `info` on `exception_t`. (https://github.com/DragonMinded/libdragon/pull/95)
453
-
454
- ### Changed
455
-
456
- - n64tool: Less IO operations for faster ROM build times. (https://github.com/DragonMinded/libdragon/pull/97)
457
-
458
- ## [4.0.1] - 2019-04-25
459
-
460
- ### Fixed
461
-
462
- - Add missing vscode files.
463
-
464
- ## [4.0.0] - 2019-04-24
465
-
466
- ### Added
467
-
468
- - Add ability to run a local test bench with ed64 support.
469
- - Add `dragonInstall` and `build` NPM scripts for managing the test bench.
470
- - Add vscode files for quick test bench execution.
471
- - `devDependencies` are now also searched for makefiles and installed in the container.
472
-
473
- ### Changed
474
-
475
- - Container mount path for this repository (NPM scripts) is now the repository root instead of `.\libdragon-source`.
476
- - make commands are now executed inside `.\libdragon-source`.
477
- - This will not effect consumers unless they depend on container's `/libdragon` path for explicitly accessing source files or relative paths with make's `-C`. They are now relative to repository root.
478
- - `--mount-path` is still supported although not used on this repository anymore. These changes do not effect a local/global installation.
479
-
480
- ## [3.2.0] - 2020-04-24
481
-
482
- ### Changed
483
-
484
- - MIT license
485
-
486
- ## [3.1.0] - 2019-03-25
487
-
488
- ### Added
489
-
490
- - Add function to detect expansion pak (https://github.com/DragonMinded/libdragon/pull/91)
491
-
492
- ### Changed
493
-
494
- - No need a tag for a travis deploy anymore.
495
-
496
- ## [3.0.0] - 2019-02-11
497
-
498
- ### Changed
499
-
500
- - Fixed vand opcode (https://github.com/DragonMinded/libdragon/pull/86)
501
- - Reimplement mtc2/mfc2 with the extended syntax allowed by RSP (https://github.com/DragonMinded/libdragon/pull/89)
502
- - Improve error message when using MIPS opcodes not available on RSP (https://github.com/DragonMinded/libdragon/pull/90)
503
-
504
- ### Added
505
-
506
- - Transfer Pak support (https://github.com/DragonMinded/libdragon/pull/88)
507
-
508
- ## [2.0.5] - 2019-12-07
509
-
510
- ### Changed
511
-
512
- - Added support information.
513
-
514
- ## [2.0.4] - 2019-12-07
515
-
516
- ### Changed
517
-
518
- - Updated readme.
519
- - Removed version injection as the versions have diverged with libdragon.
520
-
521
- ## [2.0.3] - 2019-12-06
522
-
523
- ### Changed
524
-
525
- - Updated readme.
526
- - Use base version for `start` and `download` actions if self-building in CI.
527
- - Remove unnecessary toolchain start on `update` action.
528
- - Start correct version on `buildDragon`.
529
-
530
- ## [2.0.2] - 2019-11-30
531
-
532
- ### Changed
533
-
534
- - Running `install` command now starts the container.
535
-
536
- ## [2.0.1] - 2019-11-30
537
-
538
- ### Changed
539
-
540
- - Updated repository URL.
541
-
542
- ## [2.0.0] - 2019-11-30
543
-
544
- ### Changed
545
-
546
- - Separate the docker deployment process from library code.
547
- - Upgraded `binutils` to 2.33.1.
548
- - Improved ucode example and fixed byte alignment.
549
- - Removed confusing assemply macros from `ucode.S`. This changed vector and scalar register names.
550
- - Built a new base docker hub image tagged `toolchain`.
551
- - Running `download` command no longer starts the container.
552
-
553
- ## [1.3.15] - 2019-11-01
554
-
555
- ### Changed
556
-
557
- - `libdragon install` should skip CI checks.
558
-
559
- ## [1.3.14] - 2019-10-31
560
-
561
- ### Changed
562
-
563
- - Skip make install if no Makefile is found.
564
-
565
- ## [1.3.12] - 2019-10-29
566
-
567
- ### Changed
568
-
569
- - Reduce response time for NPM commands.
570
- - Remove unnecessary console statements and double logs.
571
-
572
- ## [1.3.11] - 2019-10-29
573
-
574
- ### Fixed
575
-
576
- - Fix problem with wait ticks. They do not lock the system now.
577
-
578
- ## [1.3.9] - 2019-10-27
579
-
580
- ### Added
581
-
582
- - Add texture mirroring. https://github.com/DragonMinded/libdragon/commit/00a6cc8e6d136cf2578a50320f6ff0814dfb6657