@git-temporal/git-temporal-react
Version:
<!-- START doctoc generated TOC please keep comment here to allow auto update --> <!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
445 lines (444 loc) • 17.2 kB
HTML
<html lang="en">
<head>
<title>Code coverage report for app/actions/commits.ts</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../prettify.css" />
<link rel="stylesheet" href="../../base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1>
<a href="../../index.html">All files</a> / <a href="index.html">app/actions</a> commits.ts
</h1>
<div class='clearfix'>
</div>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134</td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { debug } from 'app/utilities/logger';
import { ICommit } from 'app/interfaces/index';
import { setDates } from 'app/actions/setDates';
import { ActionTypes } from 'app/actions/ActionTypes';
import { isVscode, vscode } from 'app/actions/vscode';
import { fetchDiff } from 'app/actions/diff';
const PAGE_SIZE = 1000;
//
// These actions fetch commits in pages until all commits are received
//
// To do this, it
// - fetches commitRange to get the bounds for paging
// - fetches each page serially until all have been received
//
// The actions below are chained and in order of calls
//
// Note that vscode does not have synchronous comm between webview
// and extension process, so the next step in the chain after a
// call to _fetch() is fired when we asynchronously receive the
// data. see src/app/actions/vscode.ts
export const fetchCommitsIfNeeded = <span class="fstat-no" title="function not covered" >path</span> => <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(d</span>ispatch, getState) => {</span>
<span class="cstat-no" title="statement not covered" > if (shouldFetchCommits(getState(), path)) {</span>
<span class="cstat-no" title="statement not covered" > dispatch(requestCommits(path));</span>
<span class="cstat-no" title="statement not covered" > dispatch(fetchCommits(path));</span>
}
};
const shouldFetchCommits = <span class="fstat-no" title="function not covered" >(s</span>tate, path) => {
<span class="cstat-no" title="statement not covered" > return (</span>
!state.commits || state.commits.length <= 0 || state.selectedPath !== path
);
};
export const requestCommits = <span class="fstat-no" title="function not covered" >path</span> => (<span class="cstat-no" title="statement not covered" >{</span>
selectedPath: path,
type: ActionTypes.REQUEST_COMMITS,
});
const fetchCommits = <span class="fstat-no" title="function not covered" >path</span> => <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >async d</span>ispatch =><span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" > {</span></span></span>
<span class="cstat-no" title="statement not covered" > dispatch(fetchDiff(path, null, null));</span>
const response = <span class="cstat-no" title="statement not covered" >await _fetch('commitRange', { path });</span>
<span class="cstat-no" title="statement not covered" > if (response) {</span>
const commitRange = <span class="cstat-no" title="statement not covered" >await response.json();</span>
<span class="cstat-no" title="statement not covered" > dispatch(receiveCommitRange(path, commitRange));</span>
}
};
export const receiveCommitRange = <span class="fstat-no" title="function not covered" >(p</span>ath, commitRange) => <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >async d</span>ispatch =><span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" > {</span></span></span>
// fetch the first page
<span class="cstat-no" title="statement not covered" > dispatch(_receiveCommitRange(path, commitRange));</span>
<span class="cstat-no" title="statement not covered" > dispatch(fetchPageOfCommits(path, 0, PAGE_SIZE));</span>
};
const _receiveCommitRange = <span class="fstat-no" title="function not covered" >(p</span>ath, commitRange) => {
<span class="cstat-no" title="statement not covered" > return {</span>
path,
commitRange,
type: ActionTypes.RECEIVE_COMMIT_RANGE,
};
};
export const fetchPageOfCommits = <span class="fstat-no" title="function not covered" >(p</span>ath, skip, maxCount) => <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >async d</span>ispatch =><span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" > {</span></span></span>
const response = <span class="cstat-no" title="statement not covered" >await _fetch('history', { path, skip, maxCount });</span>
<span class="cstat-no" title="statement not covered" > if (response) {</span>
const commits = <span class="cstat-no" title="statement not covered" >await response.json();</span>
// will serially dispatch this method until all are received
<span class="cstat-no" title="statement not covered" > dispatch(receiveCommits(path, commits));</span>
}
};
export const receiveCommits = <span class="fstat-no" title="function not covered" >(p</span>ath, response) => <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(d</span>ispatch, getState) => {</span>
const state = <span class="cstat-no" title="statement not covered" >getState();</span>
<span class="cstat-no" title="statement not covered" > if (!state.isFetching || path !== state.selectedPath) {</span>
// the user probably navigated to a new file or dir while paging
<span class="cstat-no" title="statement not covered" > return;</span>
}
<span class="cstat-no" title="statement not covered" > dispatch(_receiveCommits(path, response));</span>
<span class="cstat-no" title="statement not covered" > debug('actions/commits receiveCommits', response.skip);</span>
<span class="cstat-no" title="statement not covered" > if (state.isDiffDeferred) {</span>
const { commits } = <span class="cstat-no" title="statement not covered" >getState();</span>
<span class="cstat-no" title="statement not covered" > dispatch(fetchDiff(path, commits[1], commits[0]));</span>
}
const nextSkip = <span class="cstat-no" title="statement not covered" >response.skip + PAGE_SIZE;</span>
const { totalCommits } = <span class="cstat-no" title="statement not covered" >getState();</span>
<span class="cstat-no" title="statement not covered" > if (nextSkip < totalCommits) {</span>
// if you ask `git log -skip 500 -max-count 500` and there are say 510
// commits, git will return the last 500 commits instead of the last 10
const pageSize =
<span class="cstat-no" title="statement not covered" > nextSkip + PAGE_SIZE > totalCommits ? totalCommits - nextSkip : PAGE_SIZE;</span>
<span class="cstat-no" title="statement not covered" > dispatch(fetchPageOfCommits(path, nextSkip, pageSize));</span>
} else {
<span class="cstat-no" title="statement not covered" > dispatch(receivedAllCommits(path));</span>
}
};
export const _receiveCommits = <span class="fstat-no" title="function not covered" >(p</span>ath, response) => (<span class="cstat-no" title="statement not covered" >{</span>
selectedPath: path,
commits: response.commits,
isFileSelected: response.isFile,
type: ActionTypes.RECEIVE_COMMITS,
});
export const receivedAllCommits = <span class="fstat-no" title="function not covered" >path</span> => (<span class="cstat-no" title="statement not covered" >{</span>
selectedPath: path,
type: ActionTypes.RECEIVED_All_COMMITS,
});
const _fetch = <span class="fstat-no" title="function not covered" >(c</span>ommand, params) => {
<span class="cstat-no" title="statement not covered" > if (isVscode) {</span>
<span class="cstat-no" title="statement not covered" > debug('sending request to vscode', command, params);</span>
// see actions/vscode.ts for response handling that comes as a window event
<span class="cstat-no" title="statement not covered" > vscode.postMessage({ ...params, command });</span>
<span class="cstat-no" title="statement not covered" > return null;</span>
}
// TODO : replace this with serviceBaseUrl when it is in
const url = <span class="cstat-no" title="statement not covered" >new URL(`http://localhost:11966/git-temporal/${command}`);</span>
<span class="cstat-no" title="statement not covered" > url.search = new URLSearchParams(params).toString();</span>
<span class="cstat-no" title="statement not covered" > return fetch(url.toString());</span>
};
export const selectSingleCommit = <span class="fstat-no" title="function not covered" >commit</span> => <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(d</span>ispatch: any, _getState: any) => {</span>
<span class="cstat-no" title="statement not covered" > dispatch(</span>
setDates((commit.authorDate - 1) * 1000, (commit.authorDate + 1) * 1000)
);
};
</pre></td></tr>
</table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage
generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Mon Jan 20 2020 20:05:02 GMT-0800 (PST)
</div>
</div>
<script src="../../prettify.js"></script>
<script>
window.onload = function () {
if (typeof prettyPrint === 'function') {
prettyPrint();
}
};
</script>
<script src="../../sorter.js"></script>
</body>
</html>