mirror of
https://github.com/tj/git-extras.git
synced 2026-09-09 23:16:17 -04:00
test(git-authors): add unit test (#1098)
This commit is contained in:
parent
c13ab52138
commit
cf9fe2d23f
|
|
@ -2,3 +2,4 @@
|
|||
minversion = 7.4
|
||||
addopts = -ra -q
|
||||
testpaths = tests
|
||||
faulthandler_timeout = 5
|
||||
|
|
|
|||
|
|
@ -953,8 +953,6 @@ $ git squash HEAD~3 "Work on a feature"
|
|||
|
||||
Populates the file matching `authors|contributors -i` with the authors of commits, according to the number of commits per author.
|
||||
|
||||
Opens the file in `$EDITOR` when set.
|
||||
|
||||
See the ["MAPPING AUTHORS" section](https://git-scm.com/docs/git-shortlog#_mapping_authors) of **git-shortlog**(1) to coalesce together commits by the same person.
|
||||
|
||||
Updating AUTHORS file:
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@
|
|||
LIST=false
|
||||
NO_EMAIL=false
|
||||
FILE=""
|
||||
EDITOR=$(git var GIT_EDITOR)
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
|
|
@ -37,10 +36,10 @@ fi
|
|||
authors() {
|
||||
if $NO_EMAIL; then
|
||||
# email will be used to uniq authors.
|
||||
git shortlog -sne | awk '{$1=""; sub(" ", ""); print}' | awk -F'<' '!x[$1]++' | awk -F'<' '!x[$2]++' \
|
||||
git shortlog HEAD -sne | awk '{$1=""; sub(" ", ""); print}' | awk -F'<' '!x[$1]++' | awk -F'<' '!x[$2]++' \
|
||||
| awk -F'<' '{gsub(/ +$/, "", $1); print $1}'
|
||||
else
|
||||
git shortlog -sne | awk '{$1=""; sub(" ", ""); print}' | awk -F'<' '!x[$1]++' | awk -F'<' '!x[$2]++'
|
||||
git shortlog HEAD -sne | awk '{$1=""; sub(" ", ""); print}' | awk -F'<' '!x[$1]++' | awk -F'<' '!x[$2]++'
|
||||
fi
|
||||
}
|
||||
|
||||
|
|
@ -52,5 +51,4 @@ if $LIST; then
|
|||
authors
|
||||
else
|
||||
authors >> "$FILE"
|
||||
test -n "$EDITOR" && $EDITOR "$FILE"
|
||||
fi
|
||||
|
|
|
|||
|
|
@ -1,87 +1,59 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "GIT\-AUTHORS" "1" "October 2017" "" "Git Extras"
|
||||
.
|
||||
.\" generated with Ronn-NG/v0.9.1
|
||||
.\" http://github.com/apjanke/ronn-ng/tree/0.9.1
|
||||
.TH "GIT\-AUTHORS" "1" "November 2023" "" "Git Extras"
|
||||
.SH "NAME"
|
||||
\fBgit\-authors\fR \- Generate authors report
|
||||
.
|
||||
.SH "SYNOPSIS"
|
||||
\fBgit\-authors\fR [\-l, \-\-list] [\-\-no\-email]
|
||||
.
|
||||
.SH "DESCRIPTION"
|
||||
Populates the file matching \fIauthors|contributors \-i\fR with the authors of commits, according to the number of commits per author\. Opens the file in \fB$EDITOR\fR when set\.
|
||||
.
|
||||
.TS
|
||||
allbox;
|
||||
Populates the file matching _authors contributors \-i_ with the authors of commits, according to the number of commits per author\.
|
||||
.TE
|
||||
.P
|
||||
See the "MAPPING AUTHORS" section of \fBgit\-shortlog\fR(1) to coalesce together commits by the same person\.
|
||||
.
|
||||
.SH "OPTIONS"
|
||||
\-l, \-\-list
|
||||
.
|
||||
.P
|
||||
Show authors\.
|
||||
.
|
||||
.P
|
||||
\-\-no\-email
|
||||
.
|
||||
.P
|
||||
Don\'t show authors\' email\.
|
||||
.
|
||||
.SH "EXAMPLES"
|
||||
.
|
||||
.TP
|
||||
Updating AUTHORS file:
|
||||
.
|
||||
.IP
|
||||
$ git authors
|
||||
.
|
||||
.TP
|
||||
Listing authors:
|
||||
.
|
||||
.IP
|
||||
$ git authors \-\-list
|
||||
.
|
||||
.IP "" 4
|
||||
.
|
||||
.nf
|
||||
|
||||
$ git authors
|
||||
.fi
|
||||
.IP "" 0
|
||||
.P
|
||||
Listing authors:
|
||||
.IP "" 4
|
||||
.nf
|
||||
$ git authors \-\-list
|
||||
TJ Holowaychuk <tj@vision\-media\.ca>
|
||||
hemanth\.hm <hemanth\.hm@gmail\.com>
|
||||
Jonhnny Weslley <jw@jonhnnyweslley\.net>
|
||||
nickl\- <github@jigsoft\.co\.za>
|
||||
Leila Muhtasib <muhtasib@gmail\.com>
|
||||
.
|
||||
.fi
|
||||
.
|
||||
.IP "" 0
|
||||
|
||||
.
|
||||
.TP
|
||||
.P
|
||||
Listing authors without email:
|
||||
.
|
||||
.IP
|
||||
$ git authors \-\-list \-\-no\-email
|
||||
.
|
||||
.IP "" 4
|
||||
.
|
||||
.nf
|
||||
|
||||
$ git authors \-\-list \-\-no\-email
|
||||
TJ Holowaychuk
|
||||
hemanth\.hm
|
||||
Jonhnny Weslley
|
||||
nickl\-
|
||||
Leila Muhtasib
|
||||
.
|
||||
.fi
|
||||
.
|
||||
.IP "" 0
|
||||
|
||||
.
|
||||
.SH "AUTHOR"
|
||||
Written by Titus Wormer <\fItituswormer@gmail\.com\fR>
|
||||
.
|
||||
.SH "REPORTING BUGS"
|
||||
<\fIhttps://github\.com/tj/git\-extras/issues\fR>
|
||||
.
|
||||
.SH "SEE ALSO"
|
||||
<\fIhttps://github\.com/tj/git\-extras\fR>
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv='content-type' value='text/html;charset=utf8'>
|
||||
<meta name='generator' value='Ronn/v0.7.3 (http://github.com/rtomayko/ronn/tree/0.7.3)'>
|
||||
<meta http-equiv='content-type' content='text/html;charset=utf8'>
|
||||
<meta name='generator' content='Ronn-NG/v0.9.1 (http://github.com/apjanke/ronn-ng/tree/0.9.1)'>
|
||||
<title>git-authors(1) - Generate authors report</title>
|
||||
<style type='text/css' media='all'>
|
||||
/* style: man */
|
||||
|
|
@ -69,64 +69,69 @@
|
|||
<li class='tr'>git-authors(1)</li>
|
||||
</ol>
|
||||
|
||||
<h2 id="NAME">NAME</h2>
|
||||
|
||||
|
||||
<h2 id="NAME">NAME</h2>
|
||||
<p class="man-name">
|
||||
<code>git-authors</code> - <span class="man-whatis">Generate authors report</span>
|
||||
</p>
|
||||
|
||||
<h2 id="SYNOPSIS">SYNOPSIS</h2>
|
||||
|
||||
<p><code>git-authors</code> [-l, --list] [--no-email]</p>
|
||||
|
||||
<h2 id="DESCRIPTION">DESCRIPTION</h2>
|
||||
|
||||
<p> Populates the file matching <em>authors|contributors -i</em> with the authors of commits, according to the number of commits per author.
|
||||
Opens the file in <strong>$EDITOR</strong> when set.</p>
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Populates the file matching _authors</td>
|
||||
<td>contributors -i_ with the authors of commits, according to the number of commits per author.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<p> See the "MAPPING AUTHORS" section of <strong>git-shortlog</strong>(1) to coalesce together commits by the same person.</p>
|
||||
<p>See the "MAPPING AUTHORS" section of <strong>git-shortlog</strong>(1) to coalesce together commits by the same person.</p>
|
||||
|
||||
<h2 id="OPTIONS">OPTIONS</h2>
|
||||
|
||||
<p> -l, --list</p>
|
||||
<p>-l, --list</p>
|
||||
|
||||
<p> Show authors.</p>
|
||||
<p>Show authors.</p>
|
||||
|
||||
<p> --no-email</p>
|
||||
<p>--no-email</p>
|
||||
|
||||
<p> Don't show authors' email.</p>
|
||||
<p>Don't show authors' email.</p>
|
||||
|
||||
<h2 id="EXAMPLES">EXAMPLES</h2>
|
||||
|
||||
<dl>
|
||||
<dt>Updating AUTHORS file:</dt><dd><p></p>
|
||||
<p>Updating AUTHORS file:</p>
|
||||
|
||||
<p>$ git authors</p></dd>
|
||||
<dt>Listing authors:</dt><dd><p></p>
|
||||
<pre><code>$ git authors
|
||||
</code></pre>
|
||||
|
||||
<p>$ git authors --list</p>
|
||||
<p>Listing authors:</p>
|
||||
|
||||
<pre><code>TJ Holowaychuk <tj@vision-media.ca>
|
||||
<pre><code>$ git authors --list
|
||||
TJ Holowaychuk <tj@vision-media.ca>
|
||||
hemanth.hm <hemanth.hm@gmail.com>
|
||||
Jonhnny Weslley <jw@jonhnnyweslley.net>
|
||||
nickl- <github@jigsoft.co.za>
|
||||
Leila Muhtasib <muhtasib@gmail.com>
|
||||
</code></pre></dd>
|
||||
<dt>Listing authors without email:</dt><dd><p></p>
|
||||
</code></pre>
|
||||
|
||||
<p>$ git authors --list --no-email</p>
|
||||
<p>Listing authors without email:</p>
|
||||
|
||||
<pre><code>TJ Holowaychuk
|
||||
<pre><code>$ git authors --list --no-email
|
||||
TJ Holowaychuk
|
||||
hemanth.hm
|
||||
Jonhnny Weslley
|
||||
nickl-
|
||||
Leila Muhtasib
|
||||
</code></pre></dd>
|
||||
</dl>
|
||||
|
||||
</code></pre>
|
||||
|
||||
<h2 id="AUTHOR">AUTHOR</h2>
|
||||
|
||||
<p>Written by Titus Wormer <<a href="mailto:tituswormer@gmail.com" data-bare-link="true">tituswormer@gmail.com</a>></p>
|
||||
<p>Written by Titus Wormer <<a href="mailto:tituswormer@gmail.com" data-bare-link="true">tituswormer@gmail.com</a>></p>
|
||||
|
||||
<h2 id="REPORTING-BUGS">REPORTING BUGS</h2>
|
||||
|
||||
|
|
@ -136,10 +141,9 @@ Leila Muhtasib
|
|||
|
||||
<p><<a href="https://github.com/tj/git-extras" data-bare-link="true">https://github.com/tj/git-extras</a>></p>
|
||||
|
||||
|
||||
<ol class='man-decor man-foot man foot'>
|
||||
<li class='tl'></li>
|
||||
<li class='tc'>October 2017</li>
|
||||
<li class='tc'>November 2023</li>
|
||||
<li class='tr'>git-authors(1)</li>
|
||||
</ol>
|
||||
|
||||
|
|
|
|||
|
|
@ -8,7 +8,6 @@ git-authors(1) -- Generate authors report
|
|||
## DESCRIPTION
|
||||
|
||||
Populates the file matching _authors|contributors -i_ with the authors of commits, according to the number of commits per author.
|
||||
Opens the file in **$EDITOR** when set.
|
||||
|
||||
See the "MAPPING AUTHORS" section of **git-shortlog**(1) to coalesce together commits by the same person.
|
||||
|
||||
|
|
@ -24,33 +23,27 @@ git-authors(1) -- Generate authors report
|
|||
|
||||
## EXAMPLES
|
||||
|
||||
* Updating AUTHORS file:
|
||||
Updating AUTHORS file:
|
||||
|
||||
$ git authors
|
||||
|
||||
* Listing authors:
|
||||
Listing authors:
|
||||
|
||||
$ git authors --list
|
||||
|
||||
```
|
||||
TJ Holowaychuk <tj@vision-media.ca>
|
||||
hemanth.hm <hemanth.hm@gmail.com>
|
||||
Jonhnny Weslley <jw@jonhnnyweslley.net>
|
||||
nickl- <github@jigsoft.co.za>
|
||||
Leila Muhtasib <muhtasib@gmail.com>
|
||||
```
|
||||
|
||||
* Listing authors without email:
|
||||
Listing authors without email:
|
||||
|
||||
$ git authors --list --no-email
|
||||
|
||||
```
|
||||
TJ Holowaychuk
|
||||
hemanth.hm
|
||||
Jonhnny Weslley
|
||||
nickl-
|
||||
Leila Muhtasib
|
||||
```
|
||||
|
||||
## AUTHOR
|
||||
|
||||
|
|
|
|||
|
|
@ -29,4 +29,5 @@ def named_temp_repo(request):
|
|||
dirname = request.param
|
||||
repo = create_repo(dirname)
|
||||
init_repo_git_status(repo)
|
||||
return repo
|
||||
yield repo
|
||||
repo.teardown()
|
||||
|
|
|
|||
|
|
@ -1,13 +1,9 @@
|
|||
import os, subprocess, stat, shutil, tempfile, git
|
||||
import os, subprocess, shutil, tempfile
|
||||
from git import Repo
|
||||
|
||||
CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
GIT_EXTRAS_BIN = os.path.join(CURRENT_DIR, "..", "bin")
|
||||
GIT_EXTRAS_HELPER = os.path.join(CURRENT_DIR, "..", "helper")
|
||||
|
||||
def invoke_git_extras_command(name, *params):
|
||||
script = [os.path.join(GIT_EXTRAS_BIN, name), *params]
|
||||
print(f"Run the script \"{script}\"")
|
||||
return subprocess.run(script, capture_output=True)
|
||||
GIT_EXTRAS_BIN = os.path.abspath(os.path.join(CURRENT_DIR, "..", "bin"))
|
||||
GIT_EXTRAS_HELPER = os.path.abspath(os.path.join(CURRENT_DIR, "..", "helper"))
|
||||
|
||||
class TempRepository:
|
||||
def __init__(self, repo_work_dir = None):
|
||||
|
|
@ -18,7 +14,7 @@ class TempRepository:
|
|||
repo_work_dir = os.path.join(self._system_tmpdir, repo_work_dir)
|
||||
self._cwd = repo_work_dir
|
||||
self._tempdirname = self._cwd[len(self._system_tmpdir) + 1:]
|
||||
self._git_repo = git.Repo.init(repo_work_dir, b="default")
|
||||
self._git_repo = Repo.init(repo_work_dir, b="default")
|
||||
self._files = []
|
||||
|
||||
def switch_cwd_under_repo(self):
|
||||
|
|
@ -69,12 +65,14 @@ class TempRepository:
|
|||
|
||||
def invoke_extras_command(self, name, *params):
|
||||
command_name = "git-" + name
|
||||
print(f"Invoke the git-extras command - {command_name}")
|
||||
return invoke_git_extras_command(command_name, *params)
|
||||
print(f"Invoke the git-extras command - {command_name} at {self._cwd}")
|
||||
script = [os.path.join(GIT_EXTRAS_BIN, command_name), *list(params)]
|
||||
print(f"Run the script \"{' '.join(script)}\"")
|
||||
return subprocess.run(script, capture_output=True)
|
||||
|
||||
def invoke_installed_extras_command(self, name, *params):
|
||||
command_name = "git-" + name
|
||||
print(f"Invoke the git-extras command - {command_name}")
|
||||
print(f"Invoke the git-extras command - {command_name} at {self._cwd}")
|
||||
origin_extras_command = os.path.join(GIT_EXTRAS_BIN, command_name)
|
||||
temp_extras_command = os.path.join(self._cwd, command_name)
|
||||
helpers = [
|
||||
|
|
@ -94,7 +92,9 @@ class TempRepository:
|
|||
whole.extend(rest)
|
||||
whole.insert(0, first)
|
||||
t.write("\n".join(whole))
|
||||
print("Update file {temp_extras_command}:\n{t.read()}")
|
||||
print(f"Update file {temp_extras_command}")
|
||||
os.chmod(temp_extras_command, 0o775)
|
||||
|
||||
return subprocess.run([temp_extras_command, *params], capture_output=True)
|
||||
script = [temp_extras_command, *params]
|
||||
print(f"Run the script \"{script}\"")
|
||||
return subprocess.run(script, capture_output=True)
|
||||
|
|
|
|||
45
tests/test_authors.py
Normal file
45
tests/test_authors.py
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
import os, subprocess
|
||||
|
||||
expected_authors_list = "test <test@git-extras.com>\ntestagain <testagain@git-extras.com>\n"
|
||||
expected_authors_list_without_email = "test\ntestagain\n"
|
||||
authors_file = "AUTHORS"
|
||||
|
||||
class TestGitAuthors:
|
||||
def test_init(self, temp_repo):
|
||||
git = temp_repo.get_repo_git()
|
||||
tmp_file = temp_repo.get_file(0)
|
||||
temp_repo.writefile(tmp_file, "A")
|
||||
git.add(".")
|
||||
git.commit("-m", "test: add data A")
|
||||
git.config("--local", "user.name", "testagain")
|
||||
git.config("--local", "user.email", "testagain@git-extras.com")
|
||||
temp_repo.writefile(tmp_file, "B")
|
||||
git.add(".")
|
||||
git.commit("-m", "test: add data B")
|
||||
|
||||
def test_output_authors_has_email_without_any_parameter(self, temp_repo):
|
||||
git = temp_repo.get_repo_git()
|
||||
rs = temp_repo.invoke_extras_command("authors")
|
||||
with open(authors_file) as f:
|
||||
content = f.read()
|
||||
print(content)
|
||||
print(expected_authors_list)
|
||||
assert content == expected_authors_list
|
||||
|
||||
def test_list_authors_has_email_defaultly(self, temp_repo):
|
||||
git = temp_repo.get_repo_git()
|
||||
actual = temp_repo.invoke_extras_command("authors", "--list")
|
||||
actual = actual.stdout.decode()
|
||||
assert actual == expected_authors_list
|
||||
actual = temp_repo.invoke_extras_command("authors", "-l")
|
||||
actual = actual.stdout.decode()
|
||||
assert actual == expected_authors_list
|
||||
|
||||
def test_list_authors_has_not_email(self, temp_repo):
|
||||
git = temp_repo.get_repo_git()
|
||||
actual = temp_repo.invoke_extras_command("authors", "--list", "--no-email")
|
||||
actual = actual.stdout.decode()
|
||||
assert actual == expected_authors_list_without_email
|
||||
actual = temp_repo.invoke_extras_command("authors", "-l", "--no-email")
|
||||
actual = actual.stdout.decode()
|
||||
assert actual == expected_authors_list_without_email
|
||||
Loading…
Reference in a new issue