Skip to content

Commit

Permalink
fix(relative-tag): missing ** in pattern & generate invalid ignore pa…
Browse files Browse the repository at this point in the history
…ttern on Windows (#308)

This closes #302
  • Loading branch information
foray1010 committed Nov 16, 2020
1 parent 26be1ae commit 7fd174e
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 20 deletions.
23 changes: 3 additions & 20 deletions src/generateIgnoreFile.js
Expand Up @@ -4,10 +4,11 @@ const path = require('path')
const R = require('ramda')

const decodeIgnoreSyncFile = require('./decodeIgnoreSyncFile')
const formatRelativeIgnoreFile = require('./utils/formatRelativeIgnoreFile')
const github = require('./utils/github')
const highlightComments = require('./utils/highlightComments')
const joinLinesWithEOF = require('./utils/joinLinesWithEOF')
const { COMMENT_HEADER_ALERT, LINE_BREAK } = require('./constants')
const { COMMENT_HEADER_ALERT } = require('./constants')
const { dynamicComposeP, promiseMap } = require('./utils/ramdaHelper')
const { readFile } = require('./utils/fsHelper')

Expand All @@ -34,26 +35,8 @@ const localSourceFetcher = async (block, directory) => {
}
const relativeSourceFetcher = async (block, directory) => {
const files = await promiseMap(async (relativeFilePath) => {
const filePath = path.dirname(relativeFilePath)
const fileContent = await readFile(path.join(directory, relativeFilePath))
const splittedFileContent = fileContent.split(LINE_BREAK)
const edittedFileContent = splittedFileContent.map((line) => {
if (!line) {
return line
}

if (line.startsWith('#')) {
return line
}

if (line.startsWith('!')) {
return '!' + path.join(filePath, line.substring(1))
}

return path.join(filePath, line)
})

return edittedFileContent.join(LINE_BREAK)
return formatRelativeIgnoreFile(fileContent, path.dirname(relativeFilePath))
}, block.data)
return joinLinesWithEOF(files)
}
Expand Down
52 changes: 52 additions & 0 deletions src/utils/__tests__/formatRelativeIgnoreFile.test.js
@@ -0,0 +1,52 @@
'use strict'

const formatRelativeIgnoreFile = require('../formatRelativeIgnoreFile')

describe('formatRelativeIgnoreFile', () => {
const relativeDir = 'output'

it('should ignore empty lines', () => {
const input = '\n'.repeat(10)
expect(formatRelativeIgnoreFile(input, relativeDir)).toBe(input)
})

it('should ignore empty spaces', () => {
const input = ' \n'.repeat(10)
expect(formatRelativeIgnoreFile(input, relativeDir)).toBe(input)
})

it('should ignore comments', () => {
const input = '# comments\n'.repeat(10)
expect(formatRelativeIgnoreFile(input, relativeDir)).toBe(input)
})

it('should prepend relative path with **', () => {
expect(formatRelativeIgnoreFile('a', relativeDir)).toBe('output/**/a')
expect(formatRelativeIgnoreFile('a/', relativeDir)).toBe('output/**/a/')

expect(formatRelativeIgnoreFile('!a', relativeDir)).toBe('!output/**/a')
expect(formatRelativeIgnoreFile('!a/', relativeDir)).toBe('!output/**/a/')
})

it('should not prepend relative path with ** if already starts with **', () => {
expect(formatRelativeIgnoreFile('**/a', relativeDir)).toBe('output/**/a')
expect(formatRelativeIgnoreFile('/**/a', relativeDir)).toBe('output/**/a')

expect(formatRelativeIgnoreFile('!**/a', relativeDir)).toBe('!output/**/a')
expect(formatRelativeIgnoreFile('!/**/a', relativeDir)).toBe('!output/**/a')
})

it('should prepend relative path without **', () => {
expect(formatRelativeIgnoreFile('/a', relativeDir)).toBe('output/a')
expect(formatRelativeIgnoreFile('/a/', relativeDir)).toBe('output/a/')
expect(formatRelativeIgnoreFile('a/b', relativeDir)).toBe('output/a/b')
expect(formatRelativeIgnoreFile('a/**', relativeDir)).toBe('output/a/**')
expect(formatRelativeIgnoreFile('a//', relativeDir)).toBe('output/a//')

expect(formatRelativeIgnoreFile('!/a', relativeDir)).toBe('!output/a')
expect(formatRelativeIgnoreFile('!/a/', relativeDir)).toBe('!output/a/')
expect(formatRelativeIgnoreFile('!a/b', relativeDir)).toBe('!output/a/b')
expect(formatRelativeIgnoreFile('!a/**', relativeDir)).toBe('!output/a/**')
expect(formatRelativeIgnoreFile('!a//', relativeDir)).toBe('!output/a//')
})
})
37 changes: 37 additions & 0 deletions src/utils/formatRelativeIgnoreFile.js
@@ -0,0 +1,37 @@
'use strict'

const { LINE_BREAK } = require('../constants')

const prependRelativePath = (pattern, relativeDir) => {
if (pattern.startsWith('!')) {
return '!' + prependRelativePath(pattern.substring(1), relativeDir)
}

if (pattern.startsWith('/')) {
return [relativeDir, pattern.substring(1)].join('/')
}

if (pattern.includes('/') && pattern.indexOf('/') !== pattern.length - 1) {
return [relativeDir, pattern].join('/')
}

return [relativeDir, '**', pattern].join('/')
}

module.exports = function formatRelativeIgnoreFile(fileContent, relativeDir) {
const splittedFileContent = fileContent.split(LINE_BREAK)

const edittedFileContent = splittedFileContent.map((line) => {
if (!line.trim()) {
return line
}

if (line.startsWith('#')) {
return line
}

return prependRelativePath(line, relativeDir)
})

return edittedFileContent.join(LINE_BREAK)
}

0 comments on commit 7fd174e

Please sign in to comment.