Я решил проблемы, потому что их было 3:
- Судя по всему lightning-fs не реализует рекурсию для
rmdir
, поэтому я написал свою:
function recursive_rmdir(path) {
return pfs.readdir(path).then(fileList=> {
const allPromises = []
fileList.forEach(file => {
allPromises.push(pfs.lstat(path+'/'+file).then(fileInfo => {
if(fileInfo.isDirectory()) {
return recursive_rmdir(path+'/'+file)
} else {
return pfs.unlink(path+'/'+file)
}
}))
})
return Promise.all(allPromises).then(response => {
return pfs.rmdir(path)
})
})
}
Очевидно
lightning-fs не реализует рекурсию для
mkdir
, поэтому я написал свой собственный:
function recursive_mkdir(path) {
function mkdir(existing_path,recursive_path) {
const new_path = existing_path+recursive_path[0]+'/'
return pfs.du(new_path)
.then(diskUsage => {
return true
})
.catch(error => {
return pfs.mkdir(new_path)
.catch(error => {
console.log('error',error)
return false
})
}).then(response => {
if (recursive_path.length > 1) {
return mkdir(new_path,recursive_path.slice(1))
}
return true
})
}
return mkdir('',path.split('/'))
}
Я неправильно понял, что передавать в качестве аргументов для команды
add()
, что в ретроспективе должно было быть очевидным, но поэтому размещение только тривиальных примеров в документации никогда не является хорошей идеей, поставьте не такой тривиальный пример, чтобы прояснить варианты использования ! Итак, в чем была моя ошибка? Давайте посмотрим на параметры:
git.add({
fs: <a file system implementation client>,
dir: '<The working tree directory path>',
filepath: '<The path to the file to add to the index>'
})
Пример кода , представленный в документации API, имел только имя файла для filepath
, так как он расположен в root каталога рабочего дерева. Когда я писал свой код, я невольно сделал то же самое:
...
}).then(response => {
return pfs.writeFile(stagingRoot+path.getValue()+'/package.json', JSON.stringify({key1:val1,key2:val2}))
}).then(response => {
return git.add({ fs, dir: stagingRoot+path.getValue(), filepath: 'package.json' })
}).then(response => {
...
Но рабочий каталог dir
должен быть только stagingRoot
! И значение пути должно быть вставлено в filepath
, как показано ниже:
...
}).then(response => {
return pfs.writeFile(stagingRoot+path.getValue()+'/package.json', JSON.stringify({key1:val1,key2:val2}}))
}).then(response => {
return git.add({ fs, dir: stagingRoot, filepath: path.getValue().slice(1)+'/'+'package.json' })
}).then(response => {
...
※ .slice(1)
снимает ведущий /
, поскольку filepath
должен быть относительным путем!
Я наконец поймал свою ошибку, потому что .git
появился рядом с моим package.json
, когда я использовал readdir()
, чтобы перечислить содержимое каталога ...
Надеюсь, это кому-то поможет , поэтому я также публикую отрывки из моего окончательного кода:
const pushButton = appendButton('プッシュ',buttonSpace, function(event) {
return pfs.du(stagingRoot)
.then(diskUsage => {
return recursive_rmdir(stagingRoot)
})
.catch(error => {
return true
}).then(response => {
return pfs.mkdir(stagingRoot)
.catch(error => {
console.log(error)
return true
})
}).then(response => {
return git.clone({
fs,
http,
dir:stagingRoot,
corsProxy: 'https://cors.isomorphic-git.org',
url: repositoryURL.getValue(),
ref: branch.getValue(),
onAuth: url => {
const auth = {
username: username.getValue(),
password: password.getValue(),
}
return auth
},
singleBranch: true,
depth: 100
})
}).then(response => {
return recursive_mkdir(stagingRoot+path.getValue())
.catch(error => {
console.log(error)
return true
})
}).then(response => {
return pfs.writeFile(stagingRoot+path.getValue()+'/package.json', JSON.stringify({key1:val1,key2:val2}))
}).then(response => {
return git.add({ fs, dir: stagingRoot, filepath: path.getValue().slice(1)+'/'+'package.json' })
}).then(response => {
const user = kintone.getLoginUser()
return swal.fire({
input: 'textarea',
inputPlaceholder: 'コミットのメッセージここに入力してください',
inputAttributes: {
'aria-label': 'コミットのメッセージここに入力してください'
},
showCancelButton: true
}).then(commitMessageResponse =>{
if(commitMessageResponse.isConfirmed) {
return git.commit({
fs,
dir: stagingRoot,
author: {
name: user.name,
email: user.email,
},
message: commitMessageResponse.value,
ref: branch.getValue(),
})
} else {
return false
}
})
}).then(response => {
return git.push({
fs,
http,
dir: stagingRoot,
corsProxy: 'https://cors.isomorphic-git.org',
remote: 'origin',
ref: branch.getValue(),
onAuth: url => {
const auth = {
username: username.getValue(),
password: password.getValue(),
}
return auth
},
})
})
})