Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
## Сервер

Установка: `npm install`

Запуск: `npm start /home/user/my-repos`, где `/home/user/my-repos` - путь до папки с репозиториями

## Страницы с версткой и поиск по файлам

[http://localhost:3000/1-1](http://localhost:3000/1-1) - экраны 1.1 - 1.3 + поиск по файлам на redux

[http://localhost:3000/1-4](http://localhost:3000/1-4) - 1.4

[http://localhost:3000/1-5](http://localhost:3000/1-5) - 1.5

[http://localhost:3000/1-6](http://localhost:3000/1-6) - 1.6

[http://localhost:3000/2-1](http://localhost:3000/2-1) - 2.1

[http://localhost:3000/3-1](http://localhost:3000/3-1) - 3.1
50 changes: 25 additions & 25 deletions callbacks/addRepository.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,32 @@ const fs = require('fs');
const path = require('path');
const {execFile} = require('child_process');

let pathToRepos = process.argv[2];
const pathToRepos = process.argv[2];

//Ручка POST /api/repos + { url: ‘repo-url’ }
module.exports = function(request, response) {
let pathToRepo = pathToRepos;
let url = request.query.url.replace(/.*(?=:\/\/)/, 'git');
let params = ['clone', url];
let repoTitle = request.query.url.match(/(?<=\/)[^/]*\/?$/)[0].match(/[^/]*/)[0];
if(request.params['repositoryId']) {
params.push(request.params['repositoryId']);
repoTitle = request.params['repositoryId'];
}
pathToRepo = path.join(pathToRepos, repoTitle);
fs.access(pathToRepo, (err) => {//Проверка существования локального репозитория с таким же названием
if (!err) {
response.send(repoTitle + ' already exists');
}
else {
execFile('git', params, {cwd: pathToRepos}, (err, out) => {
if (err) {
response.status(404).send(request.query.url + ' not found');
}
else {
response.send(repoTitle + ' has been added succesfully');
}
});
}
});
let pathToRepo = pathToRepos;
const url = request.body.url.replace(/.*(?=:\/\/)/, 'git');
let params = ['clone', url];
let repoTitle = request.body.url.match(/(?<=\/)[^/]*\/?$/)[0].match(/[^/]*/)[0];
if(request.params['repositoryId']) {
params.push(request.params['repositoryId']);
repoTitle = request.params['repositoryId'];
}
pathToRepo = path.join(pathToRepos, repoTitle);
fs.access(pathToRepo, (err) => { //Проверка существования локального репозитория с таким же названием
if (!err) {
response.send(repoTitle + ' already exists');
}
else {
execFile('git', params, {cwd: pathToRepos}, (err) => {
if (err) {
response.status(404).send(request.body.url + ' not found');
}
else {
response.send(repoTitle + ' has been added succesfully');
}
});
}
});
};
44 changes: 22 additions & 22 deletions callbacks/deleteRepository.js
Original file line number Diff line number Diff line change
@@ -1,31 +1,31 @@
const fs = require('fs');
const path = require('path');

let pathToRepos = process.argv[2];
const pathToRepos = process.argv[2];

//Вспомогательная функция для удаления непустой директории
let deleteDir = function(pathToDir) {
fs.readdirSync(pathToDir).forEach(item => {
let pathToItem = path.resolve(pathToDir, item);
if (fs.statSync(pathToItem).isFile()) {
fs.unlinkSync(pathToItem);
}
else {
deleteDir(pathToItem);
}
});
fs.rmdirSync(pathToDir);
const deleteDir = function(pathToDir) {
fs.readdirSync(pathToDir).forEach(item => {
const pathToItem = path.resolve(pathToDir, item);
if (fs.statSync(pathToItem).isFile()) {
fs.unlinkSync(pathToItem);
}
else {
deleteDir(pathToItem);
}
});
fs.rmdirSync(pathToDir);
};
//Ручка DELETE /api/repos/:repositoryId
module.exports = function(request, response) {
let pathToRepo = path.join(pathToRepos, request.params['repositoryId']);
fs.access(pathToRepo, err => {//Проверка пути к репозиторию
if(err) {
response.status(404).send(pathToRepo + ' not found');
}
else {
deleteDir(pathToRepo);
response.send(request.params['repositoryId'] + ' has been deleted succesfully');
}
});
const pathToRepo = path.join(pathToRepos, request.params['repositoryId']);
fs.access(pathToRepo, err => { //Проверка пути к репозиторию
if(err) {
response.status(404).send(pathToRepo + ' not found');
}
else {
deleteDir(pathToRepo);
response.send(request.params['repositoryId'] + ' has been deleted succesfully');
}
});
};
144 changes: 72 additions & 72 deletions callbacks/getCommits.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,79 +2,79 @@ const fs = require('fs');
const path = require('path');
const {spawn} = require('child_process');

let pathToRepos = process.argv[2];
const pathToRepos = process.argv[2];

//Ручка GET /api/repos/:repositoryId/commits/:commitHash
module.exports = function(request, response) {
let pathToRepo = path.join(pathToRepos, request.params['repositoryId']);
fs.access(pathToRepo, err => {//Проверка пути к репозиторию
if(err) {
response.status(404).send(pathToRepo + ' not found');
}
else {
let out = '';
const gitLog = spawn('git', ['log', request.params['commitHash']], {cwd: pathToRepo});
gitLog.stdout.on('data', chunk => {
out += chunk.toString();
});
gitLog.on('close', code => {
if(!out) {//Проверка существования ветки или хэша коммита
response.status(404).send(request.params['commitHash'] + ' not found');
}
else {
let commits = out.split(/\n\n(?=\S)/);
let commitsJSON = commits.map(commit => ({
"SHA-1": commit.match(/[a-f0-9]{40}/)[0],
"author": commit.match(/(?<=Author:).*/)[0].trim(),
"date": commit.match(/(?<=Date:).*/)[0].trim(),
"message": commit.match(/(?<=\n\n).*/)[0].trim()
}));
//Бонусная ручка (выдача коммитов в заданном диапазоне)
if (request.query.from && request.query.to) {
let from = Number(request.query.from);
let to = Number(request.query.to);
let start = 1;
let end = commitsJSON.length;
if ((from > end && to > end) || (from < start && to < start)) {
response.status(404).send('No such commits');
}
//Определение границ диапазона
else if (from >= start && from <= end) {
if (to >= start && to <= end) {
end = to;
}
else if (to < start) {
end = start;
}
start = from;
}
else if (from > end) {
start = end;
if (to >= start && to <= end) {
end = to;
}
else {
end = 1;
}
}
else if (to <= end) {
end = to;
}
//Преобразование и выдача массива коммитов
if (start <= end) {
response.json(commitsJSON.slice(start - 1, end));
}
else {
response.json(commitsJSON.slice(end - 1, start).reverse());
}
}
//Выдача полного списка коммитов
else {
response.json(commitsJSON);
}
}
});
}
});
const pathToRepo = path.join(pathToRepos, request.params['repositoryId']);
fs.access(pathToRepo, err => { //Проверка пути к репозиторию
if(err) {
response.status(404).send(pathToRepo + ' not found');
}
else {
let out = '';
const gitLog = spawn('git', ['log', request.params['commitHash']], {cwd: pathToRepo});
gitLog.stdout.on('data', chunk => {
out += chunk.toString();
});
gitLog.on('close', () => {
if(!out) { //Проверка существования ветки или хэша коммита
response.status(404).send(request.params['commitHash'] + ' not found');
}
else {
const commits = out.split(/\n\n(?=\S)/);
const commitsJSON = commits.map(commit => ({
'SHA-1': commit.match(/[a-f0-9]{40}/)[0],
'author': commit.match(/(?<=Author:).*/)[0].trim(),
'date': commit.match(/(?<=Date:).*/)[0].trim(),
'message': commit.match(/(?<=\n\n).*/)[0].trim()
}));
//Бонусная ручка (выдача коммитов в заданном диапазоне)
if (request.query.from && request.query.to) {
const from = Number(request.query.from);
const to = Number(request.query.to);
let start = 1;
let end = commitsJSON.length;
if ((from > end && to > end) || (from < start && to < start)) {
response.status(404).send('No such commits');
}
//Определение границ диапазона
else if (from >= start && from <= end) {
if (to >= start && to <= end) {
end = to;
}
else if (to < start) {
end = start;
}
start = from;
}
else if (from > end) {
start = end;
if (to >= start && to <= end) {
end = to;
}
else {
end = 1;
}
}
else if (to <= end) {
end = to;
}
//Преобразование и выдача массива коммитов
if (start <= end) {
response.json(commitsJSON.slice(start - 1, end));
}
else {
response.json(commitsJSON.slice(end - 1, start).reverse());
}
}
//Выдача полного списка коммитов
else {
response.json(commitsJSON);
}
}
});
}
});
};
68 changes: 34 additions & 34 deletions callbacks/getDiff.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,41 +2,41 @@ const fs = require('fs');
const path = require('path');
const {spawn} = require('child_process');

let pathToRepos = process.argv[2];
const pathToRepos = process.argv[2];

//Ручка GET /api/repos/:repositoryId/commits/:commitHash/diff
module.exports = function(request, response) {
let pathToRepo = path.join(pathToRepos, request.params['repositoryId']);
fs.access(pathToRepo, err => {//Проверка пути к репозиторию
if(err) {
response.status(404).send(pathToRepo + ' not found');
}
else {
let out = '';
const gitDiff = spawn('git', ['diff', request.params['commitHash'] + '~', request.params['commitHash']], {cwd: pathToRepo});
gitDiff.stdout.on('data', chunk => {
out += chunk.toString();
});
gitDiff.on('close', code => {
if(!out) {//Проверка существования ветки или хэша коммита
response.status(404).send(request.params['commitHash'] + ' not found');
}
else {
let modifiedFiles = out.split(/\s(?=diff --git)/);
let diffJSON = modifiedFiles.map(file => {
let changeHunks = file.match(/@@.*/s)[0].split(/\s(?=@@.*@@)/);
let changeHunksJSON = changeHunks.map(hunk => ({
"range": hunk.match(/(?<=@@)[^@]*/)[0].trim(),
"lines": hunk.match(/(?<=@@.*@@).*/s)[0]
}));
return {
"pathToFile": file.match(/(?<=\+\+\+ b\/).*/)[0],
"changeHunks": changeHunksJSON
}
});
response.json(diffJSON);
}
});
}
});
const pathToRepo = path.join(pathToRepos, request.params['repositoryId']);
fs.access(pathToRepo, err => { //Проверка пути к репозиторию
if(err) {
response.status(404).send(pathToRepo + ' not found');
}
else {
let out = '';
const gitDiff = spawn('git', ['diff', request.params['commitHash'] + '~', request.params['commitHash']], {cwd: pathToRepo});
gitDiff.stdout.on('data', chunk => {
out += chunk.toString();
});
gitDiff.on('close', () => {
if(!out) { //Проверка существования ветки или хэша коммита
response.status(404).send(request.params['commitHash'] + ' not found');
}
else {
const modifiedFiles = out.split(/\s(?=diff --git)/);
const diffJSON = modifiedFiles.map(file => {
const changeHunks = file.match(/@@.*/s)[0].split(/\s(?=@@.*@@)/);
const changeHunksJSON = changeHunks.map(hunk => ({
'range': hunk.match(/(?<=@@)[^@]*/)[0].trim(),
'lines': hunk.match(/(?<=@@.*@@).*/s)[0]
}));
return {
'pathToFile': file.match(/(?<=\+\+\+ b\/).*/)[0],
'changeHunks': changeHunksJSON
};
});
response.json(diffJSON);
}
});
}
});
};
Loading