Skip to content

Commit e3ddef8

Browse files
committed
[feature] Search for commit messages.
1 parent 3d90ef3 commit e3ddef8

File tree

3 files changed

+96
-25
lines changed

3 files changed

+96
-25
lines changed

modules/git_functions.js

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,17 @@ let git = {
3737
mergeIntoCurrent,
3838
abortMerge,
3939
testGit,
40-
searchForHash
40+
searchForHash,
41+
searchForCommitMessage
4142
};
4243

44+
function searchForCommitMessage({req, res, repo}) {
45+
return logRepo({ req, res, repo, options: {
46+
searchFor: 'commitmessage',
47+
searchTerm: req.body.text
48+
} });
49+
}
50+
4351
function searchForHash({req, res, repo}) {
4452
return logRepo({req, res, repo, options: {
4553
searchFor: 'hash',
@@ -568,37 +576,36 @@ git log -n 100 --format=format:'<commit><hash>%H</hash><author_name>%an</author_
568576
log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all
569577
570578
*/
571-
let term = null;
572-
if(options) {
573-
switch(options.searchFor) {
574-
case 'hash': {
575-
term = {}
576-
break;
577-
}
578-
}
579-
}
580579
let randomSeperator = utils.getRandomSeparator();
581580
// let logFormat = `--format=format:%H${randomSeperator}%an${randomSeperator}%ae${randomSeperator}%aD${randomSeperator}%s${randomSeperator}%P`;
582581

583582
let logFormat = `--format=format:%d%n%H%n%an%n%ae%n%aD%n%P%n%s%n${randomSeperator}`;
584583

584+
let commitsInOnePageCount = 100;
585+
585586
let logArgs = ['log', logFormat];
586587

587588
if(options) {
588589
if(options.searchFor == 'hash') {
589590
logArgs.push('-1', options.searchTerm);
590591
}
592+
593+
if(options.searchFor == 'commitmessage') {
594+
logArgs.push('--grep='+ decodeURIComponent(options.searchTerm) +'', '-i', '-n ' + commitsInOnePageCount);
595+
}
591596
}
592597
else {
593-
logArgs.push('-n 100', '--branches', '--tags');
598+
logArgs.push('-n ' + commitsInOnePageCount, '--branches', '--tags');
594599
}
595600

596601
let page = req.query && req.query.page ? req.query.page : 1;
597602

598603
if(page > 1) {
599-
logArgs.push('--skip=' + ((page - 1) * 100));
604+
logArgs.push('--skip=' + ((page - 1) * commitsInOnePageCount));
600605
}
601606

607+
console.log(logArgs);
608+
602609
const child = spawn('git', logArgs, {
603610
cwd: _getCwd(repo),
604611
stdio: [0, 'pipe', 'pipe']

public/js/app/webgit-home/repo-detail/repo-detail.component.js

Lines changed: 71 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -143,32 +143,78 @@
143143
return;
144144

145145
function mainSearch() {
146-
console.log(vm.mainSearchInp);
147-
148146
var searchText = vm.mainSearchInp;
149147

150148
if(typeof searchText == 'undefined' || searchText.length == 0 || (searchText = searchText.trim()).length == 0) {
151149
restoreCommits();
152150
return;
153151
}
154152

155-
var shaRegex = /\b[0-9a-f]{5,40}\b/;
153+
clearGraph();
154+
var promise = null;
156155

156+
var shaRegex = /\b[0-9a-f]{5,40}\b/;
157157
if(shaRegex.test(searchText)) {
158158
// it is probably an SHA.
159-
repoDetailService.searchForHash(searchText).then(function(commits) {
159+
promise = repoDetailService.searchForHash(searchText).then(function(commits) {
160160
vm.commitDetails = null;
161161
parseCommits(commits);
162162
vm.commits = commits;
163163
resetCommitMap();
164-
if(commits.length > 0) {
165-
$timeout(loadGraph);
164+
return vm.commits;
165+
});
166+
}
167+
168+
// search in commit messages.
169+
170+
if(promise) {
171+
promise.then(searchByCommitMessage);
172+
}
173+
else {
174+
searchByCommitMessage();
175+
}
176+
177+
function searchByCommitMessage() {
178+
return repoDetailService.searchForCommitMessage(searchText).then(function(commits) {
179+
parseCommits(commits);
180+
if(promise) {
181+
vm.commits = vm.commits || [];
182+
}
183+
else {
184+
vm.commits = [];
166185
}
186+
187+
resetTempCommits();
188+
189+
// Array.prototype.push.apply(vm.commits, commits);
190+
vm.commits = addUniqueCommits(vm.commits, commits);
191+
192+
resetCommitMap();
167193
return vm.commits;
168194
});
169195
}
170196
}
171197

198+
199+
/**
200+
* Adds commits2 to commits1. Skips duplicates. Does not modify, returns new array.
201+
*/
202+
function addUniqueCommits(commits1, commits2) {
203+
var commits1Copy = commits1.slice(0);
204+
205+
var hashes = commits1.map(function(c) {
206+
return c.hash;
207+
});
208+
209+
var uniqueCommits = commits2.filter(function(c) {
210+
return hashes.indexOf(c.hash) == -1;
211+
});
212+
213+
Array.prototype.push.apply(commits1Copy, uniqueCommits);
214+
215+
return commits1Copy;
216+
}
217+
172218
/**
173219
* Stores commits in `commitsBackup` and `commitMapBackup`. Restore using `restoreCommits`
174220
*/
@@ -192,16 +238,9 @@
192238
graphBackup = null;
193239
graphBackup = new Image();
194240
graphBackup.src = canvas.toDataURL("image/png");
195-
// graphBackup = document.createElement('canvas');
196-
// graphBackup.width = canvas.width;
197-
// graphBackup.height = canvas.height;
198-
199-
//var graphBackupCtx = graphBackup.getContext('2D');
200-
//graphBackupCtx.drawImage(canvas, 0, 0);
201241
}
202242

203243
function restoreGraph() {
204-
// $('#graph-container').append('<canvas id="log-graph"></canvas>');
205244
var canvas = document.getElementById('log-graph');
206245
canvas.width = graphBackup.width;
207246
canvas.height = graphBackup.height;
@@ -215,6 +254,18 @@
215254
ctx.drawImage(graphBackup, 0, 0);
216255
}
217256

257+
function clearGraph() {
258+
var canvas = document.getElementById('log-graph');
259+
if(!canvas) {
260+
return;
261+
}
262+
var ctx = canvas.getContext('2d');
263+
264+
ctx.clearRect(0, 0, canvas.width, canvas.height);
265+
canvas.width = 0;
266+
canvas.height = 0;
267+
}
268+
218269
function abortMerge() {
219270
return repoDetailService.abortMerge().then(function(d) {
220271
if(!d.errorCode) {
@@ -1307,9 +1358,16 @@
13071358
this.mergeIntoCurrent = mergeIntoCurrent;
13081359
this.abortMerge = abortMerge;
13091360
this.searchForHash = searchForHash;
1361+
this.searchForCommitMessage = searchForCommitMessage;
13101362

13111363
return;
13121364

1365+
function searchForCommitMessage(searchText) {
1366+
return $http.post('/repo/' + repoName + '/searchforcommitmessage', {text: window.encodeURIComponent(searchText)}).then(function(res) {
1367+
return res.data;
1368+
});
1369+
}
1370+
13131371
function searchForHash(hash) {
13141372
return $http.post('/repo/' + repoName + '/searchforhash', {hash: hash}).then(function(res) {
13151373
return res.data;

routes/repo.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,4 +217,10 @@ router.post('/:id/searchforhash', (req, res) => {
217217
git.searchForHash({repo, req, res});
218218
});
219219

220+
router.post('/:id/searchforcommitmessage', (req, res) => {
221+
let repo = req.params.id;
222+
223+
git.searchForCommitMessage({repo, req, res});
224+
});
225+
220226
module.exports = router;

0 commit comments

Comments
 (0)