Skip to content

Commit 30fe735

Browse files
author
Joshua Grosso
committed
Refactor version-checking logic
1 parent 09fa557 commit 30fe735

File tree

3 files changed

+85
-55
lines changed

3 files changed

+85
-55
lines changed

src/commands/version.js

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,26 @@
1-
import { core } from './lfsCommands';
2-
import { parseVersion } from '../utils/checkDependencies';
31
import {
42
regex,
53
BAD_CORE_RESPONSE
64
} from '../constants';
5+
import {
6+
errorCatchHandler
7+
} from '../helpers';
8+
import { parseVersion } from '../utils/checkDependencies';
79
import generateResponse from '../utils/generateResponse';
810

9-
const version = () =>
11+
import {
12+
core
13+
} from './lfsCommands';
14+
15+
export const gitVersion = () =>
16+
core.git('--version')
17+
.then(({ stdout }) => ({
18+
...generateResponse(),
19+
raw: stdout,
20+
version: parseVersion(stdout, regex.GIT)
21+
}), errorCatchHandler);
22+
23+
export const lfsVersion = () =>
1024
core.version()
1125
.then(({ stdout, stderr }) => {
1226
const response = generateResponse();
@@ -23,4 +37,4 @@ const version = () =>
2337
return response;
2438
});
2539

26-
export default version;
40+
export default lfsVersion;

src/utils/checkDependencies.js

Lines changed: 61 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,79 +1,89 @@
1+
import fse from 'fs-extra';
2+
import path from 'path';
13
import R from 'ramda';
2-
import LFSVersion from '../commands/version';
4+
5+
import {
6+
gitVersion,
7+
lfsVersion
8+
} from '../commands/version';
39
import generateResponse from './generateResponse';
4-
import { core } from '../commands/lfsCommands';
510

611
import {
7-
regex as versionRegexes,
812
minimumVersions,
913
BAD_VERSION
1014
} from '../constants';
1115

1216
/**
1317
* @function normalizeVersion
14-
* @param Array<string> versionArray array of version number eg: ['1', '8', '3'] => 1.8.3
15-
* @return Number normalized version number
18+
* @param {Array<string>} versionArray Array of version number sections
19+
* @returns {Number} Constructed version number
20+
*
21+
* @example
22+
* normalizeVersion(['1', '8', '3']) === '1.8.3'
23+
*
24+
* @example
25+
* normalizeVersion([]) === BAD_VERSION
1626
*/
17-
const normalizeVersion = (versionArray) => {
18-
if (!versionArray || versionArray.length === 0) {
19-
return BAD_VERSION;
20-
}
21-
return R.join('.', versionArray);
22-
};
27+
const normalizeVersion = versionArray => (
28+
(versionArray && versionArray.length > 0)
29+
? R.join('.', versionArray)
30+
: BAD_VERSION
31+
);
2332

2433
export const parseVersion = (input, regex) => {
2534
if (!input) {
2635
return BAD_VERSION;
2736
}
2837

2938
const matches = input.match(regex);
30-
if (!matches || R.isEmpty(matches)) {
39+
if (!matches) {
3140
return BAD_VERSION;
3241
}
3342

34-
const numericVersionNumbers = R.filter(match => !isNaN(match), matches);
35-
if (numericVersionNumbers.length > 0) {
36-
return normalizeVersion(numericVersionNumbers);
37-
}
38-
return matches[1];
43+
const validSegments = R.filter(R.complement(isNaN), matches);
44+
45+
return R.isEmpty(validSegments)
46+
? BAD_VERSION
47+
: normalizeVersion(validSegments);
3948
};
4049

41-
export const isAtleastGitVersion = gitInput =>
42-
parseVersion(gitInput, versionRegexes.GIT) >= minimumVersions.GIT;
50+
export const isLfsRepo = workDir => fse.pathExists(path.join(workDir, '.git', 'lfs'));
51+
52+
const handleVersionResponse = (dependencyName, response) => {
53+
const {
54+
raw,
55+
stderr,
56+
success,
57+
version
58+
} = response;
4359

44-
export const isAtleastLfsVersion = lfsInput =>
45-
parseVersion(lfsInput, versionRegexes.LFS) >= minimumVersions.LFS;
60+
if (!success) {
61+
throw new Error(stderr);
62+
}
4663

47-
export const dependencyCheck = () => {
48-
const response = generateResponse();
49-
return LFSVersion().then((responseObject) => {
50-
if (!responseObject.success) {
51-
throw new Error(responseObject.stderr);
52-
}
64+
const exists = version !== BAD_VERSION;
65+
const meetsVersion = exists && version >= minimumVersions[dependencyName];
66+
67+
const constructKey = key => `${R.toLower(dependencyName)}_${key}`;
68+
return {
69+
[constructKey('exists')]: exists,
70+
[constructKey('meets_version')]: meetsVersion,
71+
[constructKey('raw')]: raw
72+
};
73+
};
5374

54-
response.lfs_meets_version = isAtleastLfsVersion(responseObject.version);
55-
response.lfs_exists = parseVersion(
56-
responseObject.version,
57-
versionRegexes.VERSION,
58-
) !== BAD_VERSION;
59-
response.lfs_raw = responseObject.raw;
75+
export const dependencyCheck = () =>
76+
Promise.all([
77+
gitVersion(),
78+
lfsVersion()
79+
])
80+
.then(([gitResponse, lfsResponse]) => ({
81+
...generateResponse(),
82+
...handleVersionResponse('GIT', gitResponse),
83+
...handleVersionResponse('LFS', lfsResponse)
84+
}));
6085

61-
return core.git('--version');
62-
})
63-
.then(({ stdout }) => {
64-
response.git_meets_version = isAtleastGitVersion(stdout);
65-
response.git_exists = parseVersion(
66-
stdout,
67-
versionRegexes.VERSION,
68-
) !== BAD_VERSION;
69-
response.git_raw = stdout;
70-
return response;
71-
})
72-
.catch((err) => {
73-
response.success = false;
74-
response.errno = BAD_VERSION;
75-
response.stderr = 'Git LFS does not exist';
76-
response.raw = err.message;
77-
return response;
78-
});
86+
export const __TESTING__ = { // eslint-disable-line no-underscore-dangle
87+
handleVersionResponse,
88+
normalizeVersion
7989
};
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import {
2+
todo
3+
} from '../../utils';
4+
5+
describe('checkDependencies', () => {
6+
});

0 commit comments

Comments
 (0)